Submission #296655

#TimeUsernameProblemLanguageResultExecution timeMemory
296655mat_vSplit the Attractions (IOI19_split)C++14
22 / 100
622 ms1048580 KiB
//#include "split.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <ext/rope> #define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i)) #define fb(i,a,b) for(int (i) = (a); (i) >= (b); --(i)) #define mod 998244353 #define xx first #define yy second #define all(a) (a).begin(), (a).end() #define pb push_back #define ll long long #define pii pair<int,int> #define maxn 200005 using namespace std; using namespace __gnu_pbds; typedef tree<pii, null_type, less<pii>,rb_tree_tag, tree_order_statistics_node_update> ordered_set;/// find_by_order(x)(x+1th) , order_of_key() (strictly less) mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); vector<int> graf[maxn]; int N, M; int subtr[maxn]; int cale[maxn]; void dfs(int x, int last){ subtr[x] = 1; cale[x] = last; for(auto c:graf[x]){ if(c == last)continue; dfs(c, x); subtr[x] += subtr[c]; } } int ost[5]; int sol[maxn]; int fr, se, tr; void oboji(int x, int last){ if(ost[fr]){ ost[fr]--; sol[x] = fr; } else{ sol[x] = tr; } for(auto c:graf[x]){ if(c == last)continue; oboji(c, x); } } void dfs2(int x){ if(x < 1)return; if(ost[se]){ ost[se]--; sol[x] = se; } else sol[x] = tr; for(auto c:graf[x]){ if(sol[c] != 0)continue; dfs2(c); } } bool mark[maxn]; int brat; void dfs3(int x, int last){ mark[x] = 1; for(auto c:graf[x]){ if(c == last)continue; if(mark[c])brat = c; else dfs3(c, x); } } void dfs4(int x){ mark[x] = 1; if(ost[2]){ ost[2]--; sol[x] = 2; } else sol[x] = 3; for(auto c:graf[x]){ if(mark[c])continue; dfs4(c); } } vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) { N = n; M = p.size(); for(int i=0; i<M; i++){ int p1 = p[i] + 1; int q1 = q[i] + 1; graf[p1].pb(q1); graf[q1].pb(p1); } if(1 == 1){ dfs(1,-1); int sef = -1; int mini1 = min(a, min(b,c)); int mini2; if(a == mini1)mini2 = min(b,c); if(b == mini1)mini2 = min(a,c); if(c == mini1)mini2 = min(a,b); //cout << mini1 << " " << mini2 << "\n"; ff(i,1,n){ int p1 = subtr[i]; int p2 = n - subtr[i]; if(p1 >= mini1 && p2 >= mini2){ sef = i; break; } if(p1 >= mini2 && p2 >= mini1){ sef = i; break; } } if(sef == -1){ vector<int> kurac; ff(i,0,n - 1)kurac.pb(0); return kurac; } ost[1] = a; ost[2] = b; ost[3] = c; int p1 = subtr[sef]; int p2 = n - p1; fr = 0, se = 0; if(p1 >= mini1 && p2 >= mini2){ if(mini1 == a)fr = 1; if(mini1 == b)fr = 2; if(mini1 == c)fr = 3; if(mini2 == a && fr != 1)se = 1; if(mini2 == b && fr != 2)se = 2; if(mini2 == c && fr != 3)se = 3; } else if(p2 >= mini1 && p1 >= mini1){ if(mini2 == a)fr = 1; if(mini2 == b)fr = 2; if(mini2 == c)fr = 3; if(mini1 == a && fr != 1)se = 1; if(mini1 == b && fr != 2)se = 2; if(mini1 == c && fr != 3)se = 3; } tr = 6 - fr - se; oboji(sef, cale[sef]); // cout << sef << " " << fr << " " << se << " " << tr << "\n"; dfs2(cale[sef]); vector<int> res; ff(i,1,n)res.pb(sol[i]); return res; } else if(a == 1){ dfs3(1, -1); assert(brat >= 1 && brat <= n); sol[brat] = 1; ff(i,1,n)mark[i] = 0; mark[brat] = 1; ost[2] = b; ost[3] = c; if(brat == 1)dfs4(2); else dfs4(1); vector<int> ans; ff(i,1,n)ans.pb(sol[i]); return ans; } }

Compilation message (stderr)

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:7:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    7 | #define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
      |                           ^
split.cpp:119:9: note: in expansion of macro 'ff'
  119 |         ff(i,1,n){
      |         ^~
split.cpp:7:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    7 | #define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
      |                           ^
split.cpp:135:13: note: in expansion of macro 'ff'
  135 |             ff(i,0,n - 1)kurac.pb(0);
      |             ^~
split.cpp:7:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    7 | #define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
      |                           ^
split.cpp:166:9: note: in expansion of macro 'ff'
  166 |         ff(i,1,n)res.pb(sol[i]);
      |         ^~
split.cpp:7:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    7 | #define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
      |                           ^
split.cpp:173:9: note: in expansion of macro 'ff'
  173 |         ff(i,1,n)mark[i] = 0;
      |         ^~
split.cpp:7:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    7 | #define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
      |                           ^
split.cpp:181:9: note: in expansion of macro 'ff'
  181 |         ff(i,1,n)ans.pb(sol[i]);
      |         ^~
split.cpp:150:13: warning: 'mini2' may be used uninitialized in this function [-Wmaybe-uninitialized]
  150 |             if(mini2 == c && fr != 3)se = 3;
      |             ^~
#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...