Submission #115249

#TimeUsernameProblemLanguageResultExecution timeMemory
115249claudyWerewolf (IOI18_werewolf)C++14
100 / 100
1010 ms142016 KiB
# include "werewolf.h" # pragma GCC optimize("Ofast") # pragma GCC optimization ("unroll-loops") # include "bits/stdc++.h" std::pair<int,int> DR[] = {{-1,0},{0,1},{1,0},{0,-1},{-1,1},{-1,-1},{1,1},{1,-1}}; # define ll long long # define clock (clock() * 1000.0 / CLOCKS_PER_SEC) # define rc(s) return cout << s,0 # define rcg(s) cout << s;exit(0) # define _ ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0); # define db(x) cerr << #x << " = " << x << '\n' # define pb push_back # define mp make_pair # define all(s) s.begin(),s.end() # define sz(x) (int)((x).size()) //# define int ll using namespace std; // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # define LOCAL # define sim template < class c # define ris return * this # define dor > debug & operator << # define eni(x) sim > typename \ enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) { sim > struct rge { c b, e; }; sim > rge<c> range(c i, c j) { return rge<c>{i, j}; } sim > auto dud(c* x) -> decltype(cerr << *x, 0); sim > char dud(...); struct debug { #ifdef LOCAL ~debug() { cerr << endl; } eni(!=) cerr << boolalpha << i; ris; } eni(==) ris << range(begin(i), end(i)); } sim, class b dor(pair < b, c > d) { ris << "(" << d.first << ", " << d.second << ")"; } sim dor(rge<c> d) { *this << "["; for (auto it = d.b; it != d.e; ++it) *this << ", " + 2 * (it == d.b) << *it; ris << "]"; } #else sim dor(const c&) { ris; } #endif }; #define show(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] " int gcd(int a, int b) { if(b) return gcd(b,a%b); return a; }mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int n,q; vector<int>eul[2]; vector<int>vec[1 << 18],vek[2][1 << 18],QRY[2][1 << 18]; vector<pair<int,int>>qry[2][1 << 18],add[1 << 18],sub[1 << 18]; int fen[1 << 18],p[2][1 << 18],SZ[2][1 << 18]; pair<int,int>seg[2][1 << 19]; int Qry(int idx) { if(idx < 0) return 0; idx++; int ans = 0; for(int i = idx;i;i -= (i & (-i))) ans += fen[i]; return ans; } void upd(int idx) { idx++; for(int i = idx;i <= n;i += (i & (-i))) fen[i] += 1; } int find(int x,int op) { if(p[op][x] == x) return x; return p[op][x] = find(p[op][x],op); } void dfs(int nod,int par,int op) { SZ[op][nod] = 1; eul[op].pb(nod); int idx = sz(eul[op]) - 1; for(auto it : vek[op][nod]) { if(it != par) { dfs(it,nod,op); SZ[op][nod] += SZ[op][it]; } } for(auto it : QRY[op][nod]) { seg[op][it] = mp(idx,idx + SZ[op][nod] - 1); } } vector<int>check_validity(int N, vector<int>X, vector<int>Y, vector<int>S, vector<int>E, vector<int>L, vector<int>R) { n = N; q = sz(S); for(int i = 0;i < sz(X);i++) { int a = X[i]; int b = Y[i]; a++;b++; vec[a].pb(b); vec[b].pb(a); } for(int i = 0;i < q;i++) { qry[0][L[i] + 1].pb(mp(i,S[i] + 1)); qry[1][R[i] + 1].pb(mp(i,E[i] + 1)); } for(int i = n;i >= 1;i--) { p[0][i] = i; for(auto it : vec[i]) { if(it < i) continue; int x = find(i,0); int y = find(it,0); if(x != y) { p[0][y] = x; vek[0][x].pb(y); } } for(auto it : qry[0][i]) { QRY[0][find(it.second,0)].pb(it.first); } } for(int i = 1;i <= n;i++) { p[1][i] = i; for(auto it : vec[i]) { if(it > i) continue; int x = find(i,1); int y = find(it,1); if(x != y) { p[1][y] = x; vek[1][x].pb(y); } } for(auto it : qry[1][i]) { QRY[1][find(it.second,1)].pb(it.first); } } /*for(int i = 1;i <= n;i++) { for(auto it : vek[0][i]) cout << it << ' '; cout << '\n'; } cout << "-------------------\n"; for(int i = 1;i <= n;i++) { for(auto it : vek[1][i]) cout << it << ' '; cout << '\n'; }*/ dfs(1,0,0); dfs(n,0,1); vector<int>ans(q,0); for(int i = 0;i < q;i++) { int l0 = seg[0][i].first;int r0 = seg[0][i].second; int l1 = seg[1][i].first;int r1 = seg[1][i].second; add[r1].pb(mp(i,r0)); sub[r1].pb(mp(i,l0 - 1)); if(!l1) continue; sub[l1 - 1].pb(mp(i,r0)); add[l1 - 1].pb(mp(i,l0 - 1)); } int idx[n]; for(int i = 0;i < n;i++) { idx[eul[0][i]] = i; } for(int i = 0;i < n;i++) { upd(idx[eul[1][i]]); for(auto it : add[i]) { ans[it.first] += Qry(it.second); } for(auto it : sub[i]) { ans[it.first] -= Qry(it.second); } } for(auto &it : ans) { it = (bool)(it); } return ans; } /* int32_t main(){_ //freopen("input","r",stdin); return 0; }*/

Compilation message (stderr)

werewolf.cpp:3:0: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
 # pragma GCC optimization ("unroll-loops")
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...