This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |