代码找错:主席树维护【路径权值最小】的最大值
查看原帖
代码找错:主席树维护【路径权值最小】的最大值
29354
CodyTheWolf楼主2020/10/20 17:55

按照官方题解改的在vector上二分就可以AC,非常迷。这份是在修改到qr时候的数组上查询点x的值。按道理来说是一样的啊((

我菜死了,主席树都写歪来,救救孩子qwq

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mid ((x+y)>>1)
using namespace std;
const int MAXN=1e5+5,MAXT=1e7;
int minval[MAXN];
int n,m,k,opt;

struct PresidentTree
{
	int root[MAXT],lt[MAXT],rt[MAXT],a[MAXT],tot;
	
	inline void Modify(int pre,int &pos,int p,int k,int x=1,int y=n)
	{
		if(!pos) pos=++tot;
		if(x!=y)
		{
			if(p<=mid) Modify(lt[pre],lt[pos],p,k,x,mid),rt[pos]=rt[pre];
			else Modify(rt[pre],rt[pos],p,k,mid+1,y),lt[pos]=lt[pre];
		}
		else a[pos]=k;
	}
	
	inline int Query(int pos,int p,int x=1,int y=n)
	{
		if(x!=y)
			if(p<=mid) return Query(lt[pos],p,x,mid);
			else return Query(rt[pos],p,mid+1,y);
		return a[pos];
	}	
}PT;

signed main(void)
{
	cin>>n>>m>>k>>opt;
	for(int i=1,x,y;i<=m;i++)
	{
		scanf("%d %d",&x,&y);
		if(x==1) continue;
		if(y==1) minval[x]=i;
		else minval[x]=max(minval[x],minval[y]);
		PT.Modify(PT.root[i-1],PT.root[i],x,minval[x]); 
	}
	for(int i=1,L=0,x,l,r;i<=k;i++)
	{
		scanf("%d %d %d",&x,&l,&r);
		if(opt) x^=L,l^=L,r^=L;
		if(x==1) {puts("1"),L++;continue;}
		if(l<=PT.Query(PT.root[r],x)) puts("1"),L++;
		else puts("0");
	}
	return 0;
}
2020/10/20 17:55
加载中...