제출 #1177667

#제출 시각아이디문제언어결과실행 시간메모리
1177667sasde다리 (APIO19_bridges)C++20
0 / 100
3093 ms4888 KiB
#include<bits/stdc++.h> #define task "strdel" #define ii pair<int,int> #define iii pair<int,ii> #define iv pair<ii,ii> #define se second #define fi first #define ffi fi.fi #define sfi se.fi #define sse se.se #define fse fi.se #define lt(i, c, d) for(int i = c; i <= d; ++i) #define fl(i, c, d) for(int i = d; i >= c; --i) #define pb push_back #define emb emplace_back #define emf emplace_front #define em emplace using namespace std; const int N=1e6+5,lg=20,mod=1e9+7; mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int Rand(int u,int v){ return u+rd()%(v-u+1); } struct pt { pt(){}; pt(int _rku,int _rkv,int _u,int _v,int _szu,int _szv,int _i):rku(_rku),rkv(_rkv),u(_u),v(_v),szu(_szu),szv(_szv),i(_i){}; int rku,rkv,u,v,szu,szv,i; }; struct zz{ int n; vector<pt>res; vector<int>r,rk,sz; void build(int _n){ n=_n; r=vector<int>(n+5); rk=vector<int>(n+5,0); sz=vector<int>(n+5,1); for(int i=1;i<=n;++i)r[i]=i; } int acs(int u){ return r[u]==u?u:acs(r[u]); } void join(int u,int v,int i){ u=acs(u); v=acs(v); if(u!=v){ if(rk[u]>rk[v])swap(u,v); res.emb(rk[u],rk[v],u,v,sz[u],sz[v],i); r[v]=u; rk[u]+=(rk[u]==rk[v]);sz[u]+=sz[v]; } } void rollback(int w){ while(!res.empty()&&w<res.back().i){ int u=res.back().u; int v=res.back().v; int rku=res.back().rku; int rkv=res.back().rkv; r[u]=u; r[v]=v; rk[u]=rku; rk[v]=rkv; sz[u]=res.back().szu; sz[v]=res.back().szv; res.pop_back(); } } }s; int n,m,ans[N]; struct pt1{ int u,v,w,i; }b[N]; vector<int>query; struct pt2{ int b,r,i; }; struct pt3{ int s,w,i; }; vector<pt2>res; vector<pt3>res1; bool k[N]; int k1[N]; void solve(){ cin >> n >> m; s.build(n); // cout <<n; for(int i=1;i<=m;++i)cin >> b[i].u >> b[i].v >> b[i].w,b[i].i=i; int q; cin >> q; int sq=sqrt(q); for(int test=1;test<=q;++test){ int t,u,v; cin >> t >> u >> v; if(t==1)res.pb({u,v,test}); else res1.pb({u,v,test}),query.emb(test); if(test%sq==0){ if(res1.empty()){ for(pt2 x:res)b[x.b].w=x.r,k[x.b]=0;; continue; } sort(res1.begin(),res1.end(),[](const pt3 &x,const pt3 &y){return x.w>y.w;}); vector<int>nojo,jo; for(pt2 x:res)k[x.b]=1; for(int i=1;i<=m;++i){ if(k[i])jo.emb(i); else nojo.emb(i); } sort(nojo.begin(),nojo.end(),[](const int &x,const int &y){ return b[x].w>b[y].w; }); int j=0; for(pt3 x:res1){ // if(test==4)cout <<x.w<<" "<<b[nojo<<'\n'; while(b[nojo[j]].w>=x.w&&j<m){ s.join(b[nojo[j]].u,b[nojo[j]].v,0); ++j; } for(pt2 y:res){ if(y.i<x.i){ k1[y.b]=y.i; } } for(int y:jo){ if(k1[y]){ if(b[k1[y]].w>=x.w)s.join(b[k1[y]].u,b[k1[y]].v,1); } else{ if(b[y].w>=x.w)s.join(b[y].u,b[y].v,1); } } ans[x.i]=s.sz[s.acs(x.s)]; s.rollback(0); for(pt2 y:res){ k1[y.b]=0; } } s.rollback(-1); // for(int i=1;i<=m;++i)cout <<b[i].w<<" ";cout<<'\n' for(pt2 x:res)b[x.b].w=x.r,k[x.b]=0; res.clear();res1.clear(); } } if(!res1.empty()){ sort(res1.begin(),res1.end(),[](const pt3 &x,const pt3 &y){return x.w>y.w;}); vector<int>nojo,jo; for(pt2 x:res)k[x.b]=1; for(int i=1;i<=m;++i){ if(k[i])jo.emb(i); else nojo.emb(i); } sort(nojo.begin(),nojo.end(),[](const int &x,const int &y){ return b[x].w>b[y].w; }); int j=0; for(pt3 x:res1){ // if(test==4)cout <<x.w<<" "<<b[nojo<<'\n'; while(b[nojo[j]].w>=x.w&&j<m){ s.join(b[nojo[j]].u,b[nojo[j]].v,0); ++j; } for(pt2 y:res){ if(y.i<x.i){ k1[y.b]=y.i; } } for(int y:jo){ if(k1[y]){ if(b[k1[y]].w>=x.w)s.join(b[k1[y]].u,b[k1[y]].v,1); } else{ if(b[y].w>=x.w)s.join(b[y].u,b[y].v,1); } } ans[x.i]=s.sz[s.acs(x.s)]; s.rollback(0); for(pt2 y:res){ k1[y.b]=0; } } } for(int i:query)cout <<ans[i]<<'\n'; } main() { srand(time(0)); ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); if(fopen(task".inp","r")){ freopen(task".inp","r",stdin); freopen(task".out","w",stdout); } int t=1; // cin >> t; while(t--){ solve(); } }

컴파일 시 표준 에러 (stderr) 메시지

bridges.cpp:194:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  194 | main()
      | ^~~~
bridges.cpp: In function 'int main()':
bridges.cpp:201:14: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  201 |       freopen(task".inp","r",stdin);
      |       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:202:14: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  202 |       freopen(task".out","w",stdout);
      |       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...