萌新求助
查看原帖
萌新求助
316801
YukinoYukinoshita楼主2022/11/26 18:03

luogu过了,loj过不了

#include"werewolf.h"
#include<bits/stdc++.h>
#define ls Tree[p].lc
#define rs Tree[p].rc
using namespace std;
const int MAXN=2e5+5;
int n,m,q;
int x,y;
int s,t,l,r;
struct Edge{
	int u,v;
	int val;
}edge1[MAXN*3],edge2[MAXN*3];
bool cmp1(Edge xs,Edge ys)
{
	return xs.val>ys.val;
}
bool cmp2(Edge xs,Edge ys)
{
	return xs.val<ys.val;
}
int fa[2*MAXN];
int find(int x)
{
	if(fa[x]==x)
	{
		return x;
	}
	fa[x]=find(fa[x]);
	return fa[x];
}
vector<int>g1[2*MAXN];
vector<int>g2[2*MAXN];
int a1[2*MAXN];
int a2[2*MAXN];
int Rel1[2*MAXN];
int Siz1[2*MAXN];
int cnt_dfn1;
int dfn1[2*MAXN];
int dp1[2*MAXN][25]; 
void dfs1(int x,int f)
{
//	printf("%d %d?\n",x,f);
	dp1[x][0]=f;
	for(int i=1;i<=20;i++)
	{
		dp1[x][i]=dp1[dp1[x][i-1]][i-1];
	}
	Siz1[x]=1;
	++cnt_dfn1;
	dfn1[x]=cnt_dfn1;
	Rel1[cnt_dfn1]=x;
	for(int i=0;i<g1[x].size();i++)
	{
		int v=g1[x][i];
		if(v==f)
		{
			continue;
		}
		dfs1(v,x);
		Siz1[x]+=Siz1[v];
	}
}
int Rel2[2*MAXN];
int Siz2[2*MAXN];
int cnt_dfn2;
int dfn2[2*MAXN];
int dp2[2*MAXN][25]; 
void dfs2(int x,int f)
{
//	printf("%d %d?\n",x,f);
	dp2[x][0]=f;
	for(int i=1;i<=20;i++)
	{
		dp2[x][i]=dp2[dp2[x][i-1]][i-1];
	}
	Siz2[x]=1;
	++cnt_dfn2;
	dfn2[x]=cnt_dfn2;
	Rel2[cnt_dfn2]=x;
	for(int i=0;i<g2[x].size();i++)
	{
		int v=g2[x][i];
		if(v==f)
		{
			continue;
		}
		dfs2(v,x);
		Siz2[x]+=Siz2[v];
	}
}
struct Seg{
	int lc,rc;
	int date;
}Tree[MAXN*20];
int cntf=0;
int New()
{
	++cntf;
	Tree[cntf].lc=0;
	Tree[cntf].rc=0;
	Tree[cntf].date=0;
	return cntf;
}
int copy(int p)
{
	++cntf;
	Tree[cntf]=Tree[p];
	return cntf;
}
int update(int p,int l,int r,int k,int x)
{
	p=copy(p);
	Tree[p].date+=x;
	if(l==r)
	{
		return p;
	}
	int mid=(l+r)>>1;
	if(k<=mid)
	{
		ls=update(ls,l,mid,k,x);
	}
	else
	{
		rs=update(rs,mid+1,r,k,x);
	}
	return p;
}
int rt[MAXN*2];
int Query(int p,int l,int r,int ql,int qr)
{
	if(!p)
	{
		return 0;
	}
	if(l>=ql&&r<=qr)
	{
		return Tree[p].date;
	}
//	printf("%d %d %d %d %d???????\n",p,l,r,ql,qr);
	int mid=(l+r)>>1;
	int Res=0;
	if(ql<=mid)
	{
		Res+=Query(ls,l,mid,ql,qr);
	}
	if(qr>mid)
	{
		Res+=Query(rs,mid+1,r,ql,qr);
	}
	return Res;
}
vector<int>check_validity(int N, vector<int>X, vector<int>Y, vector<int>S, vector<int> T, vector<int> L, vector<int> R)
{
	n=N;
	m=X.size();
	q=S.size();
	for(int i=1;i<=m;i++)
	{
		x=X[i-1];
		y=Y[i-1];
		x++;
		y++;
		edge1[i].u=x;
		edge1[i].v=y;
		edge1[i].val=min(x,y);
		edge2[i].u=x;
		edge2[i].v=y;
		edge2[i].val=max(x,y);
	} 
	sort(edge1+1,edge1+1+m,cmp1);
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
	int cnt_node1=n;
	for(int i=1;i<=m;i++)
	{
		int ex=find(edge1[i].u);
		int ey=find(edge1[i].v);
		if(ex==ey)
		{
			continue;
		}
		++cnt_node1;
		fa[cnt_node1]=cnt_node1;
		g1[cnt_node1].push_back(ex);
		g1[cnt_node1].push_back(ey);
		a1[cnt_node1]=edge1[i].val;
		fa[ex]=cnt_node1;
		fa[ey]=cnt_node1;
	}		 
	int cnt_node2=n;
	for(int i=1;i<=cnt_node1;i++)
	{
		fa[i]=i;
	}
	sort(edge2+1,edge2+1+m,cmp2);
	for(int i=1;i<=m;i++)
	{
		int ex=find(edge2[i].u);
		int ey=find(edge2[i].v);
		if(ex==ey)
		{
			continue;
		}
		++cnt_node2;
		fa[cnt_node2]=cnt_node2;
		g2[cnt_node2].push_back(ex);
		g2[cnt_node2].push_back(ey);
		a2[cnt_node2]=edge2[i].val;
		fa[ex]=cnt_node2;
		fa[ey]=cnt_node2;
	}	
	dfs1(cnt_node1,0);
	dfs2(cnt_node2,0);
	for(int i=1;i<=cnt_node1;i++)
	{
		if(Rel1[i]<=n)
		{
			rt[i]=update(rt[i-1],1,cnt_node2,dfn2[Rel1[i]],1);
		}
		else
		{
			rt[i]=rt[i-1];
		}
	}
	a1[0]=0;
	a2[0]=n+1;
	vector<int>Ans;
	Ans.clear();
	for(int fd=0;fd<q;fd++)
	{
		s=S[fd];
		t=T[fd];
		l=L[fd];
		t=R[fd];
		
		s++;
		t++;
		l++;
		r++;
		for(int i=20;i>=0;i--)
		{
			if(a1[dp1[s][i]]>=l)
			{
				s=dp1[s][i];
			}
		}
		for(int i=20;i>=0;i--)
		{
			if(a2[dp2[t][i]]<=r)
			{
				t=dp2[t][i];	
			}	
		}
		int L1=dfn1[s]-1,R1=dfn1[s]+Siz1[s]-1;
		int L2=dfn2[t],R2=dfn2[t]+Siz2[t]-1;
		int G=Query(rt[R1],1,cnt_node2,L2,R2)-Query(rt[L1],1,cnt_node2,L2,R2);
		if(G)
		{
			Ans.push_back(1);
		}
		else
		{
			Ans.push_back(0);
		}
	}
	return Ans;
} 
#include<bits/stdc++.h>
#define ls Tree[p].lc
#define rs Tree[p].rc
using namespace std;
const int MAXN=2e5+5;
int n,m,q;
int x,y;
int s,t,l,r;
struct Edge{
	int u,v;
	int val;
}edge1[MAXN*3],edge2[MAXN*3];
bool cmp1(Edge xs,Edge ys)
{
	return xs.val>ys.val;
}
bool cmp2(Edge xs,Edge ys)
{
	return xs.val<ys.val;
}
int fa[2*MAXN];
int find(int x)
{
	if(fa[x]==x)
	{
		return x;
	}
	fa[x]=find(fa[x]);
	return fa[x];
}
vector<int>g1[2*MAXN];
vector<int>g2[2*MAXN];
int a1[2*MAXN];
int a2[2*MAXN];
int Rel1[2*MAXN];
int Siz1[2*MAXN];
int cnt_dfn1;
int dfn1[2*MAXN];
int dp1[2*MAXN][25]; 
void dfs1(int x,int f)
{
//	printf("%d %d?\n",x,f);
	dp1[x][0]=f;
	for(int i=1;i<=20;i++)
	{
		dp1[x][i]=dp1[dp1[x][i-1]][i-1];
	}
	Siz1[x]=1;
	++cnt_dfn1;
	dfn1[x]=cnt_dfn1;
	Rel1[cnt_dfn1]=x;
	for(int i=0;i<g1[x].size();i++)
	{
		int v=g1[x][i];
		if(v==f)
		{
			continue;
		}
		dfs1(v,x);
		Siz1[x]+=Siz1[v];
	}
}
int Rel2[2*MAXN];
int Siz2[2*MAXN];
int cnt_dfn2;
int dfn2[2*MAXN];
int dp2[2*MAXN][25]; 
void dfs2(int x,int f)
{
//	printf("%d %d?\n",x,f);
	dp2[x][0]=f;
	for(int i=1;i<=20;i++)
	{
		dp2[x][i]=dp2[dp2[x][i-1]][i-1];
	}
	Siz2[x]=1;
	++cnt_dfn2;
	dfn2[x]=cnt_dfn2;
	Rel2[cnt_dfn2]=x;
	for(int i=0;i<g2[x].size();i++)
	{
		int v=g2[x][i];
		if(v==f)
		{
			continue;
		}
		dfs2(v,x);
		Siz2[x]+=Siz2[v];
	}
}
struct Seg{
	int lc,rc;
	int date;
}Tree[MAXN*20];
int cntf=0;
int New()
{
	++cntf;
	Tree[cntf].lc=0;
	Tree[cntf].rc=0;
	Tree[cntf].date=0;
	return cntf;
}
int copy(int p)
{
	++cntf;
	Tree[cntf]=Tree[p];
	return cntf;
}
int update(int p,int l,int r,int k,int x)
{
	p=copy(p);
	Tree[p].date+=x;
	if(l==r)
	{
		return p;
	}
	int mid=(l+r)>>1;
	if(k<=mid)
	{
		ls=update(ls,l,mid,k,x);
	}
	else
	{
		rs=update(rs,mid+1,r,k,x);
	}
	return p;
}
int rt[MAXN*2];
int Query(int p,int l,int r,int ql,int qr)
{
	if(!p)
	{
		return 0;
	}
	if(l>=ql&&r<=qr)
	{
		return Tree[p].date;
	}
//	printf("%d %d %d %d %d???????\n",p,l,r,ql,qr);
	int mid=(l+r)>>1;
	int Res=0;
	if(ql<=mid)
	{
		Res+=Query(ls,l,mid,ql,qr);
	}
	if(qr>mid)
	{
		Res+=Query(rs,mid+1,r,ql,qr);
	}
	return Res;
}
int main()
{
	scanf("%d %d %d",&n,&m,&q);
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d",&x,&y);
		x++;
		y++;
		edge1[i].u=x;
		edge1[i].v=y;
		edge1[i].val=min(x,y);
		edge2[i].u=x;
		edge2[i].v=y;
		edge2[i].val=max(x,y);
	//	printf("%d %d\n",x,y);
	} 
	sort(edge1+1,edge1+1+m,cmp1);
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
	int cnt_node1=n;
//	printf("---\n");
//	for(int i=1;i<=m;i++)
//	{
//		printf("%d %d\n",edge1[i].u,edge1[i].v);
//	}
//	printf("------\n");
	for(int i=1;i<=m;i++)
	{
		int ex=find(edge1[i].u);
		int ey=find(edge1[i].v);
		if(ex==ey)
		{
			continue;
		}
		++cnt_node1;
		fa[cnt_node1]=cnt_node1;
		g1[cnt_node1].push_back(ex);
		g1[cnt_node1].push_back(ey);
		a1[cnt_node1]=edge1[i].val;
		fa[ex]=cnt_node1;
		fa[ey]=cnt_node1;
	//	printf("%d %d\n",cnt_node1,ex);
	//	printf("%d %d\n",cnt_node1,ey);
	}		 
	//printf("-----\n");
	int cnt_node2=n;
	for(int i=1;i<=cnt_node1;i++)
	{
		fa[i]=i;
	}
	sort(edge2+1,edge2+1+m,cmp2);
	for(int i=1;i<=m;i++)
	{
		int ex=find(edge2[i].u);
		int ey=find(edge2[i].v);
		if(ex==ey)
		{
			continue;
		}
		++cnt_node2;
		fa[cnt_node2]=cnt_node2;
		g2[cnt_node2].push_back(ex);
		g2[cnt_node2].push_back(ey);
		a2[cnt_node2]=edge2[i].val;
		fa[ex]=cnt_node2;
		fa[ey]=cnt_node2;
	//	printf("%d %d\n",cnt_node2,ex);
	//	printf("%d %d\n",cnt_node2,ey);
	}	
	dfs1(cnt_node1,0);
	dfs2(cnt_node2,0);
	for(int i=1;i<=cnt_node1;i++)
	{
		if(Rel1[i]<=n)
		{
			rt[i]=update(rt[i-1],1,cnt_node2,dfn2[Rel1[i]],1);
	//		printf("%d %d %d\n",i,dfn2[Rel1[i]],Rel1[i]);
		}
		else
		{
			rt[i]=rt[i-1];
		}
	}
	a1[0]=0;
	a2[0]=n+1;
	while(q--)
	{
		scanf("%d %d %d %d",&s,&t,&l,&r);
		s++;
		t++;
		l++;
		r++;
	//	printf("%d???\n",a1[10]);
		for(int i=20;i>=0;i--)
		{
			if(a1[dp1[s][i]]>=l)
			{
				s=dp1[s][i];
			}
		}
		for(int i=20;i>=0;i--)
		{
			if(a2[dp2[t][i]]<=r)
			{
				t=dp2[t][i];	
			}	
		}
	//	printf("%d %d?\n",s,t);
		int L1=dfn1[s]-1,R1=dfn1[s]+Siz1[s]-1;
		int L2=dfn2[t],R2=dfn2[t]+Siz2[t]-1;
		int G=Query(rt[R1],1,cnt_node2,L2,R2)-Query(rt[L1],1,cnt_node2,L2,R2);
	//	printf("%d %d??????\n",Query(rt[R1],1,cnt_node2,L2,R2),Query(rt[L1],1,cnt_node2,L2,R2));
		
	//	printf("%d %d ???\n",Tree[rt[R1]].date,Tree[rt[L1]].date);
	//	printf("%d %d %d %d %d?\n",L1,R1,L2,R2,cnt_node2);
		if(G)
		{
			printf("1\n");
		}
		else
		{
			printf("0\n");
		}
	}
} 
2022/11/26 18:03
加载中...