제출 #1320088

#제출 시각아이디문제언어결과실행 시간메모리
1320088StefanSebez전압 (JOI14_voltage)C++20
100 / 100
223 ms7472 KiB
#include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define ll long long const int N=1e5+50; int n,m; vector<pair<int,int>>edges; struct DSU{ int par[N],sajz[N],bip;bool f[N]; vector<array<int,3>>undo; DSU(){Init();} void Init(){for(int i=1;i<N;i++)par[i]=i,sajz[i]=1,f[i]=0;bip=0;} pair<int,bool>FS(int u){ if(u==par[u])return {u,false}; auto [v,x]=FS(par[u]); return {v,x^f[u]}; } bool US(int u,int v){ auto [u1,c1]=FS(u); auto [u2,c2]=FS(v); if(u1==u2){ int x=0; if(c1==c2)x=1; bip+=x; undo.pb({u1,u2,x}); return false; } if(sajz[u1]>sajz[u2])swap(u1,u2),swap(c1,c2); par[u1]=u2; sajz[u2]+=sajz[u1]; f[u1]=c1^c2^1; undo.pb({u1,u2,0}); return true; } void Undo(){ auto [u1,u2,x]=undo.back();undo.pop_back(); if(u1==u2)bip-=x; else{ par[u1]=u1; sajz[u2]-=sajz[u1]; f[u1]=0; } } }dsu; int Solve(int l,int r){ if(l>r)return 0; int mid=l+r>>1; for(int i=l;i<mid;i++)dsu.US(edges[i].fi,edges[i].se); for(int i=mid+1;i<=r;i++)dsu.US(edges[i].fi,edges[i].se); int res=0; if(dsu.bip==0){ auto [u,v]=edges[mid]; auto [u1,c1]=dsu.FS(u); auto [u2,c2]=dsu.FS(v); if(u1!=u2||c1==c2)res++;//,printf("[%i %i]\n",edges[mid].fi,edges[mid].se); } for(int i=mid+1;i<=r;i++)dsu.Undo(); dsu.US(edges[mid].fi,edges[mid].se); res+=Solve(mid+1,r); for(int i=l;i<=mid;i++)dsu.Undo(); for(int i=mid;i<=r;i++)dsu.US(edges[i].fi,edges[i].se); res+=Solve(l,mid-1); for(int i=mid;i<=r;i++)dsu.Undo(); return res; } int main(){ scanf("%i%i",&n,&m); for(int i=0;i<m;i++){ int u,v;scanf("%i%i",&u,&v); edges.pb({u,v}); } int res=Solve(0,m-1); printf("%i\n",res); return 0; }

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

voltage.cpp: In function 'int main()':
voltage.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |     scanf("%i%i",&n,&m);
      |     ~~~~~^~~~~~~~~~~~~~
voltage.cpp:71:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |         int u,v;scanf("%i%i",&u,&v);
      |                 ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...