제출 #1160874

#제출 시각아이디문제언어결과실행 시간메모리
1160874modwweSimurgh (IOI17_simurgh)C++20
100 / 100
129 ms8740 KiB
#include "simurgh.h" #pragma GCC optimize("Ofast,unroll-loops") #include<bits/stdc++.h> //#define int long long #define ll long long #define down cout<<'\n'; #define debug cout<<" cucuucucuuu",down #define modwwe int t;cin>>t; while(t--) #define bit(i,j) (i>>j&1) #define sobit(a) __builtin_popcountll(a) #define task2 "ftree" #define task "test" #define fin(x) freopen(x".inp","r",stdin) #define fou(x) freopen(x".out","w",stdout) #define pb push_back #define mask(k) (1ll<<k) #define checktime cerr << (double)clock() / CLOCKS_PER_SEC * 1000 << " ms"; using namespace std; #define getchar_unlocked getchar mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l,int r) { return uniform_int_distribution<int>(l,r)(rd); } void phongbeo(); const int inf = 4e18+1; const int mod2 = 1e9+7; //const int base=67; int n, m, s1, s2, s4, s3, sf, k, s5, s6, mx, s7, s8, s9, mx2, res, dem2 = 0, dem = 0, s33, dem3, dem4, mid, l2, r2, center; int i, s10, s12,k1,k2,k3,s11,lim,w,l,r,dem5,dem6,dem7,dem9,now,root,q,start,en; int kk; int el = 19;/* main() { if(fopen(task2".inp","r")) { fin(task2); fou(task2); } if(fopen(task".inp","r")) { fin(task); fou(task); } ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); // cin>>s1; // int t;cin>>t;while(t--) phongbeo(),down checktime }*/ vector<int> U,V; int d[501][501]; struct ib { int a,b; }; struct dsuconcu { ib dsu[501]; void reset(int n) { for(int i=0; i<=n; i++) dsu[i]= {1,i}; } int get(int x) { if(dsu[x].b!=x)dsu[x].b=get(dsu[x].b); return dsu[x].b; } bool noi(int x,int y) { x=get(x); y=get(y); if(x==y) return 0; if(dsu[x].a<dsu[y].a)swap(x,y); dsu[x].a+=dsu[y].a; dsu[y].b=x; return 1; } };/* namespace jury { dsuconcu ds; void wrong(int x) { cout<<"WRONG "<<x; exit(0); } void check_spanning_tree(vector<int>&v) { ds.reset(n); int s=0; for(int i=0; i<v.size(); i++) s+=ds.noi(U[v[i]],V[v[i]]); if(s!=v.size())wrong(4); } int count_common_roads(vector<int>&v) { if(v.size()!=n-1) wrong(1); for(int i=0; i<v.size(); i++) { for(int j=i+1; j<v.size(); j++) if(v[i]==v[j]) { wrong(2); } if(v[i]>=m||v[i]<0)wrong(3); } check_spanning_tree(v); int s=0; for(int i=0; i<v.size(); i++) s+=d[U[v[i]]][V[v[i]]]; return s; } };*/ namespace phongcubu { dsuconcu ds; vector<int> enemy,ke[501],all[501]; int base; ib edge[130001],a[501]; int cost[501]; int c[501][501],pos[501][501],real[130001],royal[501],par[501]; bool go[501]; int dd[501];/* int count_common_roads(vector<int>&v) { return jury::count_common_roads(v); }*/ void dfs(int x) { go[x]=1; dd[x]=++dem3; for(auto f:ke[x]) if(!go[f]) { par[f]=x; c[f][x]=c[x][f]=enemy.size(); enemy.pb(pos[x][f]); dfs(f); } else if(par[x]!=f) { if(dd[f]<dd[x]) { if(x<f)all[x].pb(f); else all[f].pb(x); s2=x; while(s2!=f) { if(a[s2].a==-1)a[s2]= {x,f}; s2=par[s2]; } } } } int get(int x,int y,int z) { int pc=c[x][par[x]]; enemy[pc]=pos[y][z]; int ans=count_common_roads(enemy); enemy[pc]=pos[x][par[x]]; return ans; } void work(int x) { s2=a[x].a; s3=a[x].b; vector<int> ask; while(s2!=s3) { ask.pb(s2); s2=par[s2]; } s2=-1; s3=-1; for(auto f:ask) if(royal[f]!=-1) { s2=get(f,a[x].a,a[x].b); s3=royal[f]; break; } if(s3!=-1) { for(auto f:ask) if(royal[f]==-1) { s4=get(f,a[x].a,a[x].b); if(s4==s2)royal[f]=s3; else royal[f]=1-s3; } } else { s2=base; for(auto f:ask) cost[f]=get(f,a[x].a,a[x].b),s2=max(s2,cost[f]); for(auto f:ask) { if(cost[f]==s2)royal[f]=0; else royal[f]=1; } } } bool check(vector<int> v) { ds.reset(n); for(auto x:v) if(!ds.noi(edge[x].a,edge[x].b)) { ///wtf assert(0); } int s=0; for(auto x:enemy) if(ds.noi(edge[x].a,edge[x].b)) { v.pb(x); if(par[edge[x].a]==edge[x].b)s+=royal[edge[x].a]; else s+=royal[edge[x].b]; } return s-count_common_roads(v)<0; } vector<int> find_roads(int N,vector<int> U,vector<int> V) { n=N; m=U.size(); enemy.clear(); for(int i=0; i<n; i++) ke[i].clear(),a[i]= {-1,-1},go[i]=0; for(int i=0; i<m; i++) real[i]=0; for(int i=0; i<m; i++) { edge[i]= {U[i],V[i]}; ke[U[i]].pb(V[i]), ke[V[i]].pb(U[i]); } for(int i=0; i<m; i++) pos[U[i]][V[i]]=pos[V[i]][U[i]]=i; dfs(0); base=count_common_roads(enemy); /// if a[i]==-1 no bridge for(int i=1; i<n; i++) if(a[i].a==-1)royal[i]=1; else royal[i]=-1; /// dont know for(int i=1; i<n; i++) { if(royal[i]==-1) work(i); real[pos[i][par[i]]]=royal[i]; } for(int i=0; i<n; i++) { r=-1; while(true) { s9=r+1; l=r+1; r=all[i].size()-1; while(l<=r) { int mid=l+r>>1; vector<int> dec; for(int j=s9; j<=mid; j++) dec.pb(pos[i][all[i][j]]); if(check(dec))r=mid-1; else l=mid+1; } if(r==all[i].size()-1) break; r++; real[pos[i][all[i][r]]]=1; } } vector<int> haha; for(int i=0; i<m; i++) if(real[i]) haha.pb(i); return haha; } }; vector<int> find_roads(int N,vector<int> U,vector<int> V) { return phongcubu::find_roads(N,U,V); } void phongbeo() { cin>>n>>m; for(int i=1; i<=m; i++) { cin>>l>>r; U.pb(l); V.pb(r); } for(int i=1; i<n; i++) { cin>>l; d[U[l]][V[l]]=1; } find_roads(n,U,V); }

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

simurgh.cpp:26:21: warning: overflow in conversion from 'double' to 'int' changes value from '4.0e+18' to '2147483647' [-Woverflow]
   26 | const int inf = 4e18+1;
      |                 ~~~~^~
#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...