Submission #816828

#TimeUsernameProblemLanguageResultExecution timeMemory
816828ttamxWerewolf (IOI18_werewolf)C++14
100 / 100
932 ms122032 KiB
#include "werewolf.h" #include<bits/stdc++.h> using namespace std; typedef pair<int,int> p2; const int N=2e5+5; const int M=4e5+5; const int K=(1<<19)+5; int n,m,q; vector<int> adj[N]; int s[N],e[N],l[N],r[N]; vector<int> ql[N],qr[N]; int pl[N],pr[N]; p2 ranl[N],ranr[N]; int posx[N],posy[N]; vector<int> num[N]; struct dsu_t{ int p[M]; int in[M],out[M],pos[M]; vector<p2> node; void init(){ for(int i=0;i<2*n;i++){ p[i]=i; } node=vector<p2>(n,p2(-1,-1)); } int fp(int u){ if(u==p[u])return u; return p[u]=fp(p[u]); } void uni(int u,int v){ u=fp(u),v=fp(v); if(u==v)return; int np=node.size(); p[u]=p[v]=np; node.emplace_back(u,v); } void dfs(int u,int &t){ if(u<n){ in[u]=out[u]=++t; pos[t]=u; return; } auto [l,r]=node[u]; dfs(l,t); dfs(r,t); in[u]=min(in[l],in[r]); out[u]=max(out[l],out[r]); } void dfs(){ int t=0; dfs(node.size()-1,t); } }dsu; struct segtree{ vector<int> t[K]; void build(int l,int r,int i){ if(l==r)return void(t[i]=num[l]); int m=(l+r)/2; build(l,m,i*2); build(m+1,r,i*2+1); int x=0,y=0; while(x<t[i*2].size()||y<t[i*2+1].size()){ if(x==t[i*2].size()||(y<t[i*2+1].size()&&t[i*2][x]>t[i*2+1][y]))t[i].emplace_back(t[i*2+1][y++]); else t[i].emplace_back(t[i*2][x++]); } } void build(){ build(1,n,1); } int query(int l,int r,int i,int x,int y,int a,int b){ if(y<l||r<x)return 0; if(x<=l&&r<=y)return upper_bound(t[i].begin(),t[i].end(),b)-lower_bound(t[i].begin(),t[i].end(),a); int m=(l+r)/2; return query(l,m,i*2,x,y,a,b)+query(m+1,r,i*2+1,x,y,a,b); } int query(int x,int y,int a,int b){ return query(1,n,1,x,y,a,b); } }seg; 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; m=X.size(); q=S.size(); for(int i=0;i<m;i++){ int u=X[i],v=Y[i]; adj[u].emplace_back(v); adj[v].emplace_back(u); } for(int i=0;i<q;i++){ s[i]=S[i]; e[i]=E[i]; l[i]=L[i]; r[i]=R[i]; ql[l[i]].emplace_back(i); qr[r[i]].emplace_back(i); } dsu.init(); for(int u=n-1;u>=0;u--){ for(auto v:adj[u]){ if(v<u)continue; dsu.uni(u,v); } for(auto i:ql[u]){ pl[i]=dsu.fp(s[i]); } } dsu.dfs(); for(int i=0;i<n;i++)posx[i]=dsu.in[i]; for(int i=0;i<q;i++){ int p=pl[i]; ranl[i]=p2(dsu.in[p],dsu.out[p]); } dsu.init(); for(int u=0;u<n;u++){ for(auto v:adj[u]){ if(v>u)continue; dsu.uni(u,v); } for(auto i:qr[u]){ pr[i]=dsu.fp(e[i]); } } dsu.dfs(); for(int i=0;i<n;i++)posy[i]=dsu.in[i]; for(int i=0;i<q;i++){ int p=pr[i]; ranr[i]=p2(dsu.in[p],dsu.out[p]); } for(int i=0;i<n;i++)num[posx[i]].emplace_back(posy[i]); for(int i=1;i<=n;i++)sort(num[i].begin(),num[i].end()); seg.build(); vector<int> ans(q); for(int i=0;i<q;i++){ auto [x,y]=ranl[i]; auto [a,b]=ranr[i]; ans[i]=seg.query(x,y,a,b)>0; } return ans; }

Compilation message (stderr)

werewolf.cpp: In member function 'void dsu_t::dfs(int, int&)':
werewolf.cpp:48:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   48 |   auto [l,r]=node[u];
      |        ^
werewolf.cpp: In member function 'void segtree::build(int, int, int)':
werewolf.cpp:68:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |   while(x<t[i*2].size()||y<t[i*2+1].size()){
      |         ~^~~~~~~~~~~~~~
werewolf.cpp:68:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |   while(x<t[i*2].size()||y<t[i*2+1].size()){
      |                          ~^~~~~~~~~~~~~~~~
werewolf.cpp:69:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |    if(x==t[i*2].size()||(y<t[i*2+1].size()&&t[i*2][x]>t[i*2+1][y]))t[i].emplace_back(t[i*2+1][y++]);
      |       ~^~~~~~~~~~~~~~~
werewolf.cpp:69:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |    if(x==t[i*2].size()||(y<t[i*2+1].size()&&t[i*2][x]>t[i*2+1][y]))t[i].emplace_back(t[i*2+1][y++]);
      |                          ~^~~~~~~~~~~~~~~~
werewolf.cpp: In function 'std::vector<int> check_validity(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
werewolf.cpp:141:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  141 |   auto [x,y]=ranl[i];
      |        ^
werewolf.cpp:142:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  142 |   auto [a,b]=ranr[i];
      |        ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...