이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define ld long double
#define ll long long
#define int ll
#define FF first.first
#define FS first.second
#define SF second.first
#define SS second.second
#define PB push_back
#define MP make_pair
#define all(cont) cont.begin(),cont.end()
#define rall(cont) cont.rbegin(), cont.rend()
#define FOR(i, j) for(int i=0;i<j;i++)
#define RFOR(i, j) for (int i=j;i>=0;i--)
#define GO cin.tie(NULL);
#define FAST ios_base::sync_with_stdio(false);
#define prec(x) cout << fixed << setprecision(x)
#define sz(x) (int)x.size()
typedef pair<int,int> pii;
typedef vector<int> VI;
typedef vector<pii> VPII;
typedef vector<VI> VVI;
typedef priority_queue<int> max_heap;
typedef priority_queue<pii> max_heapii;
typedef priority_queue<int,VI,greater<int>> min_heap;
typedef priority_queue<pii,VPII,greater<pii>> min_heapii;
const long double PI = 3.14159265359;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
ll randint(ll a, ll b){return uniform_int_distribution<ll>(a, b)(rng);}
#define deb(...) logger(#__VA_ARGS__, __VA_ARGS__)
template<typename ...Args>
void logger(string vars, Args&&... values) {
cout << vars << " = ";
string delim = "";
(..., (cout << delim << values, delim = ", "));
cout<<endl;
}
void print(vector<int>v){
cout<<"[";
FOR(i,v.size()){
cout<<v[i];
if(i+1!=v.size())cout<<", ";
}
cout<<"]"<<endl;
}
void print(pii p){
cout<<"{"<<p.first<<", "<<p.second<<"}"<<endl;
}
struct DSU{
int* arr;
int* size;
stack<vector<pair<int,int>>> rb;
int cc;
DSU(int n){
cc=n;
arr = new int[n];
for (int i=0;i<n;i++){
arr[i]=-1;
}
rb.push(vector<pair<int,int>>());
}
int find(int a){
while(arr[a]>=0)a=arr[a];
return a;
}
void uniao(int a,int b){
int paia=find(a);
int paib=find(b);
if (paia==paib)return;
cc--;
//paib é maior, entao liga em b
int tam=arr[paia]+arr[paib];
if (arr[paia]>arr[paib]){
rb.top().push_back({paib,arr[paib]});
rb.top().push_back({paia,arr[paia]});
arr[paia]=paib;
arr[paib]=tam;
}
else{
rb.top().push_back({paib,arr[paib]});
rb.top().push_back({paia,arr[paia]});
arr[paib]=paia;
arr[paia]=tam;
}
}
void persist(){
rb.push(vector<pair<int,int>>());
}
void rollback(){
auto changes=rb.top();
rb.pop();
int n=changes.size();
cc+=n/2;
for (int i=n-1;i>=0;i--){
arr[changes[i].first]=changes[i].second;
}
}
};
const int maxn=1e5+10;
const int magic=330;
int ord[maxn];
int ans[maxn];
int n;
vector<pair<int,pii>> bridges;//{weight,{a,b}};
vector<pair<int,pii>> updates[magic];//{tempo,{qual,peso}};
vector<pair<int,pii>> queries[magic];//{peso,{tempo,qual}};
void solve(DSU& dsu,int u,pair<int,pii> q){
int it=0;
set<int> mudados;
for(auto k:updates[u]){
mudados.insert(k.SF);
}
map<int,int> mudanca;
while(it<sz(updates[u]) && updates[u][it].first<q.SF){
mudanca[updates[u][it].SF]=updates[u][it].SS;
it++;
}
for(auto k:mudados){
if (mudanca.find(k)==mudanca.end()){
if (bridges[k].first>=q.first){
//deb(bridges[k].SS,bridges[k].SF);
dsu.uniao(bridges[k].SS,bridges[k].SF);
}
}
else{
if (mudanca[k]>=q.first){
//deb(bridges[k].SS,bridges[k].SF);
dsu.uniao(bridges[k].SS,bridges[k].SF);
}
}
}
//deb(ord[q.SF]);
ans[ord[q.SF]]=-dsu.arr[dsu.find(q.SS)];
}
void solve(int u){
DSU dsu(n);
//deb(n,dsu.cc);
set<int> ss;
FOR(i,sz(bridges))ss.insert(i);
for(auto k:updates[u]) ss.erase(k.SF);
set<pii> unchanged;
for(auto k:ss){
unchanged.insert({bridges[k].first,k});
}
sort(rall(queries[u]));
auto it=unchanged.begin();
for(auto q:queries[u]){
while(it!=unchanged.end()){
if (it->first>=q.first){
//deb(bridges[it->second].SF,bridges[it->second].SS);
dsu.uniao(bridges[it->second].SF,bridges[it->second].SS);
it++;
}
else break;
}
//cout<<"PERSISTINDO"<<endl;
dsu.persist();
solve(dsu,u,q);
//cout<<"ROLLBACK"<<endl;
dsu.rollback();
}
for(auto k:updates[u]){
bridges[k.SF].first=k.SS;
}
}
signed main(){
GO FAST
int m;cin>>n>>m;
bridges=vector<pair<int,pii>>(m);
FOR(i,m){
int a,b,c;cin>>a>>b>>c;a--;b--;
bridges[i]={c,{a,b}};
}
int q;cin>>q;
int cont=0;
FOR(i,q){
int a,b,c;cin>>a>>b>>c;
b--;
if (a==1){//update
updates[i/magic].push_back({i,{b,c}});
}
else{
queries[i/magic].push_back({c,{i,b}});
ord[i]=cont++;
}
}
FOR(i,magic)solve(i);
FOR(i,cont){
cout<<ans[i]<<endl;
}
}
컴파일 시 표준 에러 (stderr) 메시지
bridges.cpp: In function 'void logger(std::string, Args&& ...)':
bridges.cpp:41:49: warning: fold-expressions only available with '-std=c++17' or '-std=gnu++17'
41 | (..., (cout << delim << values, delim = ", "));
| ^
bridges.cpp: In function 'void print(std::vector<long long int>)':
bridges.cpp:16:32: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
16 | #define FOR(i, j) for(int i=0;i<j;i++)
......
47 | FOR(i,v.size()){
| ~~~~~~~~~~
bridges.cpp:47:2: note: in expansion of macro 'FOR'
47 | FOR(i,v.size()){
| ^~~
bridges.cpp:49:9: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
49 | if(i+1!=v.size())cout<<", ";
| ~~~^~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |