#include <bits/stdc++.h>
#include "werewolf.h"
using namespace std;
struct krt
{
vector<vector<int>>g,lca;
vector<int>dsu,el,er;
int timer=0;
int vfind(int a)
{
if(a==dsu[a])return a;
return dsu[a]=vfind(dsu[a]);
}
void kmerge(int a,int b,bool k)
{
int a1=vfind(a),b1=vfind(b);
if(a1!=b1)
{
if(a1>b1&&k)swap(a1,b1);
else if(k==0&&a1<b1)swap(a1,b1);
dsu[a1]=b1;
g[b1].push_back(a1);
}
}
void dfs(int a,int b)
{
el[a]=timer;timer++;
lca[a][0]=b;
for(int i=1;i<20;i++)
{
lca[a][i]=lca[lca[a][i-1]][i-1];
}
for(auto i:g[a])
{
dfs(i,a);
}
er[a]=timer-1;
}
krt(int n)
{
dsu.resize(n);
g.resize(n);
lca.resize(n,vector<int>(20));
el.resize(n);
er.resize(n);
for(int i=0;i<n;i++)dsu[i]=i;
}
};
vector<int>st;
void update(int i,int l,int r,int x)
{
if(l==r)st[i]=1;
else
{
int m=(l+r)/2;
if(x<=m)update(2*i,l,m,x);
else update(2*i+1,m+1,r,x);
st[i]=st[2*i]+st[2*i+1];
}
}
int gsum(int i,int l,int r,int tl,int tr)
{
if(l>r||tl>r||l>tr)return 0;
if(tl<=l&&r<=tr)return st[i];
int m=(l+r)/2;
return gsum(2*i,l,m,tl,tr)+gsum(2*i+1,m+1,r,tl,tr);
}
vector<int> check_validity(int n,vector<int> x,vector<int> y,vector<int> S,vector<int> E,vector<int> L,vector<int> R)
{
int m=x.size(),q=L.size();
vector<int>pos(n),res(q);
krt a(n),b(n);
st.resize(4*n+1);
vector<vector<int>>koce(n);
vector<vector<pair<int,pair<int,int>>>>lq(n),rq(n);
for(int i=0;i<m;i++)
{
if(x[i]<y[i])swap(x[i],y[i]);
koce[x[i]].push_back(y[i]);
}
for(int i=0;i<n;i++)
{
for(auto j:koce[i])
{
a.kmerge(i,j,1);
}
koce[i].clear();
}
a.dfs(n-1,n-1);
for(int i=0;i<m;i++)
{
koce[y[i]].push_back(x[i]);
}
for(int i=n-1;i>=0;i--)
{
for(auto j:koce[i])
{
b.kmerge(i,j,0);
}
}
b.dfs(0,0);
for(int i=0;i<n;i++)pos[a.el[i]]=b.el[i];
for(int i=0;i<q;i++)
{
int s=S[i],e=E[i],l=L[i],r=R[i];
for(int j=19;j>=0;j--)
{
if(b.lca[s][j]>=l)s=b.lca[s][j];
if(a.lca[e][j]<=r)e=a.lca[e][j];
}
lq[a.el[e]].push_back({i,{b.el[s],b.er[s]}});
rq[a.er[e]].push_back({i,{b.el[s],b.er[s]}});
}
for(int i=0;i<n;i++)
{
for(auto p:lq[i])
{
res[p.first]-=gsum(1,0,n-1,p.second.first,p.second.second);
}
update(1,0,n-1,pos[i]);
for(auto p:rq[i])
{
res[p.first]+=gsum(1,0,n-1,p.second.first,p.second.second);
}
}
for(int i=0;i<q;i++)
{
if(res[i]>0)res[i]=1;
else res[i]=0;
}
return res;
}
# | 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... |