RE on #3 求助
查看原帖
RE on #3 求助
599287
_masppy_楼主2023/11/3 21:46

代码如下:

#include<bits/stdc++.h>
#define lson pos<<1
#define rson pos<<1|1
#define ll long long
using namespace std;
const int maxn=2e5+10;
int n,m,t;
struct qst{
	int u,v,w;
};
struct node{
	int frontmx,frontmn,backmx,backmn,mx,mn,sum;
    node(){
        frontmx=frontmn=backmx=backmn=mx=mn=sum=0;
    }
	node operator +(const node &t) const{
		node res;
		res.frontmx=max(frontmx,sum+t.frontmx);
		res.frontmn=min(frontmn,sum+t.frontmn);
		res.backmx=max(t.sum+backmx,t.backmx);
		res.backmn=min(t.sum+backmn,t.backmn);
		res.mx=max(mx,max(t.mx,t.frontmx+backmx));
		res.mn=min(mn,min(t.mn,t.frontmn+backmn));
		res.sum=sum+t.sum;

		return res;
	}

	node rev(){
		node ans = *this;
		swap(ans.frontmx,ans.backmx);
		swap(ans.frontmx,ans.backmn);
		return ans;
	}
};


int main(){
	scanf("%d",&t);
	
	while(t--){
		vector< pair<int,int> > q;
		vector<qst> p;
		q.push_back(make_pair(-1,1));
        scanf("%d",&n);

		int tot=1;
		for(int i=1;i<=n;i++){
			char c[10];
			scanf("%s",c+1);
			if(c[1]=='+'){
				int x,y;
				scanf("%d%d",&x,&y);
                x--;
				q.push_back(make_pair(x,y));
				tot++;
			}
			else{
				int u,v,x;
				scanf("%d%d%d",&u,&v,&x);
                u--;
                v--;
                p.push_back((qst){u,v,x});
			}
		}

		int upbound=__lg(tot);
		vector fa(upbound+1,vector<int>(n,-1));
		vector f(upbound+1,vector<node>(n));
		vector <int> dep(n);

		for(int i=0;i<tot;i++){
		    int x=q[i].first;
			if(i) dep[i]=dep[x]+1;
			fa[0][i]=x;
			if(q[i].second==1)  f[0][i].mx=f[0][i].frontmx=f[0][i].backmx=f[0][i].sum=1;
			else f[0][i].mn=f[0][i].frontmn=f[0][i].backmn=f[0][i].sum=-1;
			for(int j=0;(1<<(j+1))<=dep[i]+1;j++){
				fa[j+1][i]=fa[j][fa[j][i]];
				f[j+1][i]=f[j][i]+f[j][fa[j][i]];
			}
		}

		auto lca=[&](int x,int y){
			if(dep[x]<dep[y]) swap(x,y);
			node l,r;
			int upbound1=log2(tot);
			for(int i=upbound1;i>=0;i--){
				if(dep[x]-dep[y]>=(1<<i)){
					l=l+f[i][x];
					x=fa[i][x];
				}
			}

			if(x==y){
				return l+f[0][x];
			}

			for(int i=upbound1;i>=0;i--){
				if(fa[i][x]!=fa[i][y]){
					l=l+f[i][x];
					r=r+f[i][y];
					x=fa[i][x];
					y=fa[i][y];
				}
			}

			return l+f[1][x]+f[0][y]+r.rev();
		};

		int siz=p.size();
		for(int i=0;i<siz;i++){
			int u=p[i].u;
			int v=p[i].v;
			int k=p[i].w;
			auto ans=lca(u,v);
            //cout<<ans.mn<<" "<<ans.mx<<endl;
			if(k>=ans.mn&&k<=ans.mx){
				printf("YES\n");
			}
			else printf("NO\n");
		}
	}
}
2023/11/3 21:46
加载中...