Submission #1011151

#TimeUsernameProblemLanguageResultExecution timeMemory
1011151hyforces늑대인간 (IOI18_werewolf)C++14
100 / 100
344 ms79444 KiB
#include<bits/stdc++.h> #include"werewolf.h" using namespace std; struct DSU{ vector<int>fa; void init(int n){ fa.resize(n); iota(fa.begin(),fa.end(),0); } int root(int u){return u==fa[u]?u:fa[u]=root(fa[u]);} bool merge(int u,int v){ u=root(u),v=root(v); if(u==v)return false; fa[v]=u; return true; } }; struct SegTree{ int n; vector<int>t; void init(int n){ this->n=n; t.clear(); t.resize(2*n+2,0); } void add(int i,int v){ for(t[i+=n]+=v;i>>=1;)t[i]=t[i<<1]+t[i<<1|1]; } int query(int l,int r){ int ret=0; for(l+=n,r+=n+1;l<r;l>>=1,r>>=1){ if(l&1)ret+=t[l++]; if(r&1)ret+=t[--r]; } return ret; } }; vector<vector<int>>fake1,fake2; vector<int>tin1,tout1,ord1; int t1=0; void dfs1(int u){ tin1[u]=++t1; ord1.push_back(u); for(auto a:fake1[u]){ dfs1(a); } tout1[u]=t1; } vector<int>tin2,tout2,ord2; int t2=0; void dfs2(int u){ tin2[u]=++t2; ord2.push_back(u); for(auto a:fake2[u]){ dfs2(a); } tout2[u]=t2; } vector<int>check_validity(int n,vector<int>eu,vector<int>ev,vector<int>qs,vector<int>qe,vector<int>ql,vector<int>qr){ int q=qs.size(); vector<vector<int>>adj(n); for(int a=0;a<eu.size();++a){ adj[eu[a]].push_back(ev[a]); adj[ev[a]].push_back(eu[a]); } fake1=fake2=vector<vector<int>>(n); DSU con; vector<int>qq(q);iota(qq.begin(),qq.end(),0); con.init(n); sort(qq.begin(),qq.end(),[&](int i,int j)->bool{ return qr[i]<qr[j]; }); vector<int>qu(q),qv(q); for(int a=0,qa=0;a<n;++a){ for(auto b:adj[a]){ if(b>=a)continue; int ra=con.root(a),rb=con.root(b); if(ra!=rb){ con.merge(ra,rb); fake1[ra].push_back(rb); } } while(qa<q&&qr[qq[qa]]<=a){ qv[qq[qa]]=con.root(qe[qq[qa]]); ++qa; } } con.init(n); sort(qq.begin(),qq.end(),[&](int i,int j)->bool{ return ql[i]>ql[j]; }); for(int a=n-1,qa=0;a>=0;--a){ for(auto b:adj[a]){ if(b<=a)continue; int ra=con.root(a),rb=con.root(b); if(ra!=rb){ con.merge(ra,rb); fake2[ra].push_back(rb); } } while(qa<q&&ql[qq[qa]]>=a){ qu[qq[qa]]=con.root(qs[qq[qa]]); ++qa; } } tin1.resize(n);tout1.resize(n); tin2.resize(n);tout2.resize(n); ord1.clear(); ord2.clear(); t1=t2=-1; dfs1(n-1); dfs2(0); vector<int>point(n); vector<vector<pair<int,bool>>>event(n+1); for(int a=0;a<n;++a)point[a]=tin2[ord1[a]]; for(int a=0;a<q;++a){ event[tin1[qv[a]]].push_back({a,true}); event[tout1[qv[a]]+1].push_back({a,false}); } SegTree pro; pro.init(n); vector<int>ans(q,0); for(int a=0;a<=n;++a){ for(auto b:event[a]){ if(b.second)ans[b.first]-=pro.query(tin2[qu[b.first]],tout2[qu[b.first]]); else ans[b.first]+=pro.query(tin2[qu[b.first]],tout2[qu[b.first]]); } if(a<n)pro.add(point[a],1); } for(auto&a:ans)a=(a>0); return ans; }

Compilation message (stderr)

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:63:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |     for(int a=0;a<eu.size();++a){
      |                 ~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...