# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1101590 | 2024-10-16T11:14:35 Z | MMihalev | Simurgh (IOI17_simurgh) | C++14 | 3000 ms | 5880 KB |
#include<iostream> #include<algorithm> #include<set> #include<queue> #include "simurgh.h" using namespace std; const int MAX_N=5e2+3; const int MAX_M=125000; int n,m; int q; vector<int>edges; vector<pair<int,int>>g[MAX_N]; bool used[MAX_N]; vector<int>comp; vector<vector<int>>comps; int adj[MAX_N]; int numedge[MAX_N][MAX_N]; bool stat[MAX_M]; bool checked[MAX_M]; int forsure; bool mm[MAX_N]; bool uu[MAX_N]; int pre[MAX_N]; void reset() { comps.clear(); edges.clear(); for(int i=0;i<n;i++) { adj[i]=-1; used[i]=0; } } void dfs(int u) { if(adj[u]!=-1) { if(!checked[adj[u]]) { comp.push_back(adj[u]); } if(stat[adj[u]])forsure=adj[u]; } used[u]=1; for(auto [v,edge]:g[u]) { if(used[v])continue; edges.push_back(edge); dfs(v); } } void rep(int prev,int edge) { for(int i=0;i<edges.size();i++) { if(edges[i]==prev){edges[i]=edge;return;} } } vector<pair<int,int>>s; int rec(int l,int r) { if(l==r) { return s[l].first; } int mid=(l+r)/2; int bonus=0; edges.clear(); for(int i=0;i<n;i++)used[i]=0; for(int i=l;i<=mid;i++) { edges.push_back(s[i].first); used[s[i].second]=1; } for(int i=1;i<n;i++) { if(!used[i]){bonus+=stat[numedge[0][i]];edges.push_back(numedge[0][i]);} } int cnt=count_common_roads(edges)-bonus;q++; if(cnt>0)return rec(l,mid); return rec(mid+1,r); } bool dfu[MAX_N]; int vers; void df(int u) { vers++; dfu[u]=1; for(auto [v,edge]:g[u]) { if(dfu[v] or mm[v]==0)continue; df(v); } } vector<int> find_roads(int N, vector<int> u, vector<int> v) { n=N; m=u.size(); vector<int>ans; for(int i=0;i<m;i++) { g[u[i]].push_back({v[i],i}); g[v[i]].push_back({u[i],i}); numedge[u[i]][v[i]]=i; numedge[v[i]][u[i]]=i; } set<pair<int,int>>so; int e=0; for(int i=0;i<n;i++) { so.insert({g[i].size(),i}); pre[i]=g[i].size(); } int cc=0; vector<int>verts; while(so.size()>0) { auto f=(*(so.rbegin())); so.erase(f); int u=f.second; verts.push_back(u); e+=g[u].size(); cc++; mm[u]=1; for(auto [v,edge]:g[u])uu[v]=1; for(int i=0;i<n;i++) { if(mm[i])continue; int npre=0; for(auto [v,edge]:g[i]) { if(uu[v] or mm[v])continue; npre++; } so.erase({pre[i],i}); pre[i]=npre; so.insert({pre[i],i}); } bool bad=0; for(int i=0;i<n;i++) { if(mm[i])continue; if(uu[i])continue; bad=1; break; } if(bad==0) { break; } } df(verts[0]); if(vers!=verts.size())while(1); if(m!=n*(n-1)/2) { for(int u=0;u<n;u++) { reset(); used[u]=1; for(auto [v,edge]:g[u]) { adj[v]=edge; } for(auto [v,edge]:g[u]) { if(!used[v]) { forsure=-1; comp.clear(); dfs(v); if(forsure!=-1) { comp.push_back(forsure); } comps.push_back(comp); } } for(auto c:comps) { edges.push_back(c[0]); } for(auto c:comps) { int ma=count_common_roads(edges);q++; vector<int>marked; marked.push_back(c[0]); int prev=c[0]; int sega=0; for(int edge:c) { if(edge==c[0])continue; rep(prev,edge); int cur=count_common_roads(edges);q++; if(cur>ma) { sega++; marked.clear(); ma=cur; marked.push_back(edge); if(sega==2)break; } else if(cur==ma) { marked.push_back(edge); } prev=edge; } for(int edge:marked)stat[edge]=1; } for(auto [v,edge]:g[u])checked[edge]=1; } } else { for(int u=0;u<n;u++) { if(u==0) { vector<int>marked; edges.clear(); for(int v=2;v<n;v++) { edges.push_back(numedge[v-1][v]); } int ma=-1; for(auto [v,edge]:g[u]) { edges.push_back(edge); int cur=count_common_roads(edges);q++; edges.pop_back(); if(cur>ma) { marked.clear(); marked.push_back(edge); ma=cur; } else if(cur==ma)marked.push_back(edge); } for(int edge:marked)stat[edge]=1; continue; } while(1) { int bonus=0; edges.clear(); s.clear(); for(int i=0;i<n;i++)used[i]=0; for(auto [v,edge]:g[u]) { if(stat[edge] or v==0)continue; edges.push_back(edge); s.push_back({edge,v}); used[v]=1; } for(int i=1;i<n;i++) { if(!used[i]){bonus+=stat[numedge[0][i]];edges.push_back(numedge[0][i]);} } int cur=count_common_roads(edges)-bonus;q++; if(cur==0)break; int edge=rec(0,s.size()-1); stat[edge]=1; } } } for(int i=0;i<m;i++) { if(stat[i])ans.push_back(i); } return ans; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 336 KB | correct |
2 | Correct | 1 ms | 336 KB | correct |
3 | Correct | 1 ms | 336 KB | correct |
4 | Correct | 1 ms | 336 KB | correct |
5 | Correct | 1 ms | 336 KB | correct |
6 | Correct | 1 ms | 336 KB | correct |
7 | Correct | 1 ms | 504 KB | correct |
8 | Correct | 1 ms | 336 KB | correct |
9 | Correct | 1 ms | 336 KB | correct |
10 | Correct | 1 ms | 336 KB | correct |
11 | Correct | 1 ms | 336 KB | correct |
12 | Correct | 1 ms | 336 KB | correct |
13 | Correct | 1 ms | 336 KB | correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 336 KB | correct |
2 | Correct | 1 ms | 336 KB | correct |
3 | Correct | 1 ms | 336 KB | correct |
4 | Correct | 1 ms | 336 KB | correct |
5 | Correct | 1 ms | 336 KB | correct |
6 | Correct | 1 ms | 336 KB | correct |
7 | Correct | 1 ms | 504 KB | correct |
8 | Correct | 1 ms | 336 KB | correct |
9 | Correct | 1 ms | 336 KB | correct |
10 | Correct | 1 ms | 336 KB | correct |
11 | Correct | 1 ms | 336 KB | correct |
12 | Correct | 1 ms | 336 KB | correct |
13 | Correct | 1 ms | 336 KB | correct |
14 | Correct | 1 ms | 592 KB | correct |
15 | Correct | 1 ms | 592 KB | correct |
16 | Correct | 1 ms | 592 KB | correct |
17 | Correct | 2 ms | 592 KB | correct |
18 | Correct | 1 ms | 592 KB | correct |
19 | Correct | 2 ms | 592 KB | correct |
20 | Correct | 2 ms | 592 KB | correct |
21 | Correct | 2 ms | 592 KB | correct |
22 | Correct | 1 ms | 592 KB | correct |
23 | Correct | 2 ms | 592 KB | correct |
24 | Correct | 1 ms | 408 KB | correct |
25 | Execution timed out | 3055 ms | 336 KB | Time limit exceeded |
26 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 336 KB | correct |
2 | Correct | 1 ms | 336 KB | correct |
3 | Correct | 1 ms | 336 KB | correct |
4 | Correct | 1 ms | 336 KB | correct |
5 | Correct | 1 ms | 336 KB | correct |
6 | Correct | 1 ms | 336 KB | correct |
7 | Correct | 1 ms | 504 KB | correct |
8 | Correct | 1 ms | 336 KB | correct |
9 | Correct | 1 ms | 336 KB | correct |
10 | Correct | 1 ms | 336 KB | correct |
11 | Correct | 1 ms | 336 KB | correct |
12 | Correct | 1 ms | 336 KB | correct |
13 | Correct | 1 ms | 336 KB | correct |
14 | Correct | 1 ms | 592 KB | correct |
15 | Correct | 1 ms | 592 KB | correct |
16 | Correct | 1 ms | 592 KB | correct |
17 | Correct | 2 ms | 592 KB | correct |
18 | Correct | 1 ms | 592 KB | correct |
19 | Correct | 2 ms | 592 KB | correct |
20 | Correct | 2 ms | 592 KB | correct |
21 | Correct | 2 ms | 592 KB | correct |
22 | Correct | 1 ms | 592 KB | correct |
23 | Correct | 2 ms | 592 KB | correct |
24 | Correct | 1 ms | 408 KB | correct |
25 | Execution timed out | 3055 ms | 336 KB | Time limit exceeded |
26 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 336 KB | correct |
2 | Correct | 1 ms | 504 KB | correct |
3 | Correct | 39 ms | 4420 KB | correct |
4 | Correct | 62 ms | 5696 KB | correct |
5 | Correct | 62 ms | 5704 KB | correct |
6 | Correct | 63 ms | 5712 KB | correct |
7 | Correct | 57 ms | 5684 KB | correct |
8 | Correct | 59 ms | 5768 KB | correct |
9 | Correct | 61 ms | 5880 KB | correct |
10 | Correct | 61 ms | 5712 KB | correct |
11 | Correct | 61 ms | 5724 KB | correct |
12 | Correct | 61 ms | 5712 KB | correct |
13 | Correct | 1 ms | 336 KB | correct |
14 | Correct | 59 ms | 5748 KB | correct |
15 | Correct | 63 ms | 5712 KB | correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 336 KB | correct |
2 | Correct | 1 ms | 336 KB | correct |
3 | Correct | 1 ms | 336 KB | correct |
4 | Correct | 1 ms | 336 KB | correct |
5 | Correct | 1 ms | 336 KB | correct |
6 | Correct | 1 ms | 336 KB | correct |
7 | Correct | 1 ms | 504 KB | correct |
8 | Correct | 1 ms | 336 KB | correct |
9 | Correct | 1 ms | 336 KB | correct |
10 | Correct | 1 ms | 336 KB | correct |
11 | Correct | 1 ms | 336 KB | correct |
12 | Correct | 1 ms | 336 KB | correct |
13 | Correct | 1 ms | 336 KB | correct |
14 | Correct | 1 ms | 592 KB | correct |
15 | Correct | 1 ms | 592 KB | correct |
16 | Correct | 1 ms | 592 KB | correct |
17 | Correct | 2 ms | 592 KB | correct |
18 | Correct | 1 ms | 592 KB | correct |
19 | Correct | 2 ms | 592 KB | correct |
20 | Correct | 2 ms | 592 KB | correct |
21 | Correct | 2 ms | 592 KB | correct |
22 | Correct | 1 ms | 592 KB | correct |
23 | Correct | 2 ms | 592 KB | correct |
24 | Correct | 1 ms | 408 KB | correct |
25 | Execution timed out | 3055 ms | 336 KB | Time limit exceeded |
26 | Halted | 0 ms | 0 KB | - |