Submission #1104791

#TimeUsernameProblemLanguageResultExecution timeMemory
1104791alexander707070Simurgh (IOI17_simurgh)C++14
100 / 100
144 ms8280 KiB
#include<bits/stdc++.h> #pragma GCC optimize ("O3") #pragma GCC target ("sse4") #include "simurgh.h" #define MAXN 507 #define MAXM 300007 using namespace std; int n,m,dep[MAXN],edges; vector< pair<int,int> > v[MAXN],tree[MAXN]; bool intree[MAXM],vis[MAXN]; pair<int,int> edge[MAXM],parent[MAXN]; int value[MAXM],st[MAXM],sumtree; vector<int> ans; unordered_set<int> s; int questions; int calc(vector<int> rem,vector<int> add){ questions++; for(int i:rem)s.erase(i); for(int i:add)s.insert(i); vector<int> w; for(int i:s){ w.push_back(i-1); } for(int i:rem)s.insert(i); for(int i:add)s.erase(i); return count_common_roads(w); } void dfs(int x){ vis[x]=true; for(int i=0;i<v[x].size();i++){ if(vis[v[x][i].first])continue; dep[v[x][i].first]=dep[x]+1; parent[v[x][i].first]={x,v[x][i].second}; tree[x].push_back({v[x][i].first,v[x][i].second}); tree[v[x][i].first].push_back({x,v[x][i].second}); dfs(v[x][i].first); intree[v[x][i].second]=true; s.insert(v[x][i].second); } } vector<int> path,toask; int total; void dfs2(int x){ vis[x]=true; for(int i=0;i<tree[x].size();i++){ if(vis[tree[x][i].first])continue; toask.push_back(tree[x][i].second-1); total-=(value[tree[x][i].second]-1); dfs2(tree[x][i].first); } } bool ok; void up(int x,int y){ if(x==y)return; if(value[parent[x].second]==0 or ok){ if(value[parent[x].second])ok=false; path.push_back(parent[x].second); } up(parent[x].first,y); } int howmany(int root,int l,int r){ toask.clear(); for(int i=1;i<=n;i++)vis[i]=false; vis[root]=true; for(int i=l;i<=r;i++)vis[v[root][i].first]=true; for(int i=l;i<=r;i++){ toask.push_back(v[root][i].second-1); } total=0; dfs2(root); for(int i=l;i<=r;i++){ dfs2(v[root][i].first); } questions++; total+=count_common_roads(toask); return total; } void solve(int root,int l,int r,int s){ if(l==r and s>0){ value[v[root][l].second]=2; return; } int mid=(l+r)/2; int lt=howmany(root,l,mid); if(lt>0){ solve(root,l,mid,lt); } if(s-lt){ solve(root,mid+1,r,s-lt); } } vector<int> find_roads(int N,vector<int> from,vector<int> to){ n=N; m=int(from.size()); double start=clock(); for(int i=1;i<=m;i++){ from[i-1]++; to[i-1]++; edge[i]={from[i-1],to[i-1]}; v[from[i-1]].push_back({to[i-1],i}); v[to[i-1]].push_back({from[i-1],i}); } dfs(1); sumtree=calc({},{}); for(int i=1;i<=m;i++){ if(intree[i])continue; int u=from[i-1],w=to[i-1]; if(dep[u]>dep[w])swap(u,w); path.clear(); ok=true; up(w,u); int mins=sumtree,maxs=sumtree,br=0,ask=0; for(int f:path){ if(value[f]==0){ st[f]=calc({f},{i}); br++; mins=min(mins,st[f]); maxs=max(maxs,st[f]); } } if(br==0)continue; if(mins==maxs){ for(int f:path){ if(value[f]==0)continue; st[f]=calc({f},{i}); ask=value[f]; mins=min(mins,st[f]); maxs=max(maxs,st[f]); break; } } if(ask==0)ask=1; for(int f:path){ if(value[f]!=0)continue; if(mins==maxs)value[f]=ask; else{ if(st[f]==mins)value[f]=2; else value[f]=1; } } } if(questions>2*n)cout<<1/0; for(int i=1;i<=m;i++){ if(intree[i] and value[i]==0)value[i]=2; } for(int i=1;i<=n;i++){ sort(v[i].begin(),v[i].end()); for(int f=0;f<v[i].size();f++){ if(v[i][f].first>i){ solve(i,f,v[i].size()-1,howmany(i,f,v[i].size()-1)); break; } } } for(int i=1;i<=m;i++){ if(value[i]==2){ ans.push_back(i-1); } } return ans; }

Compilation message (stderr)

simurgh.cpp: In function 'void dfs(int)':
simurgh.cpp:46:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |  for(int i=0;i<v[x].size();i++){
      |              ~^~~~~~~~~~~~
simurgh.cpp: In function 'void dfs2(int)':
simurgh.cpp:68:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |  for(int i=0;i<tree[x].size();i++){
      |              ~^~~~~~~~~~~~~~~
simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:203:26: warning: division by zero [-Wdiv-by-zero]
  203 |  if(questions>2*n)cout<<1/0;
      |                         ~^~
simurgh.cpp:212:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  212 |   for(int f=0;f<v[i].size();f++){
      |               ~^~~~~~~~~~~~
simurgh.cpp:139:9: warning: unused variable 'start' [-Wunused-variable]
  139 |  double start=clock();
      |         ^~~~~
#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...