在线求调,大佬帮帮我!!!
查看原帖
在线求调,大佬帮帮我!!!
140876
syzf2222楼主2021/8/20 13:02

感觉非常的没有什么问题,但是WA了。

#include<bits/stdc++.h>
using namespace std;
#define inf 1e9
const int maxn=2e5+10;
const int mod=1e9+7;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
	return x*f;
}
int n,m,a[maxn],b[maxn],f[maxn];
int len,lft[maxn],rht[maxn],pos[maxn],sum[maxn];
inline int find(int x){
	if(f[x]==x)return x;
	return f[x]=find(f[x]);
}
inline int ask(int x){
	if(find(x)==x)return b[x];
	return max(0,a[x]-sum[pos[x]]);
}
int s1[maxn],s2[maxn],t1,t2;
inline int lca(int x,int y){
	s1[t1=1]=x;s2[t2=1]=y;
	while(x!=y){
		//printf("%d %d\n",x,y);
		if(x>y)x=ask(x),s1[++t1]=x;
		else y=ask(y),s2[++t2]=y;
	}x=s1[max(1,t1-1)],y=s2[max(1,t2-1)];
	//puts("over");
	while(x!=y){
		//printf("%d %d\n",x,y);
		if(x>y)x=max(1,a[x]-sum[pos[x]]);
		else y=max(1,a[y]-sum[pos[y]]);
	}return x;
}
inline void modify(int l,int r,int x){
	for(int i=l;i<=rht[pos[l]]&&i<=r;i++){
		a[i]-=x;
		if(pos[max(0,a[i]-sum[pos[i]])]!=pos[i])f[i]=find(i+1);
		else b[i]=ask(a[i]-sum[pos[i]]);
	}if(pos[l]==pos[r])return;
	for(int i=pos[l]+1;i<pos[r];i++){
		sum[i]+=x;
		for(int j=lft[i];j<=rht[i];j++){
			j=find(j);if(j>rht[i])break;
			if(pos[max(0,a[j]-sum[i])]!=pos[j])f[j]=find(j+1);
			else b[j]=ask(a[j]-sum[i]);
		}
	}
	for(int i=lft[pos[r]];i<=r;i++){
		a[i]-=x;
		if(pos[max(0,a[i]-sum[pos[i]])]!=pos[i])f[i]=find(i+1);
		else b[i]=ask(a[i]-sum[pos[i]]);
	}
}
int main(){
	n=read(),m=read();
	len=sqrt(n)+1;
	for(int i=1;i<=len;i++){
		lft[i]=(i-1)*len+1;rht[i]=i*len;
		if(rht[i]>n)rht[i]=n;
		for(int j=lft[i];j<=rht[i];j++)pos[j]=i;
	}
	for(int i=2;i<=n;i++)a[i]=read();
	for(int i=1;i<=n+1;i++)f[i]=i;
	for(int i=1;i<=n;i++)
		if(pos[a[i]]!=pos[i])b[i]=a[i],f[i]=i+1;
		else b[i]=b[a[i]];
	//for(int i=1;i<=n;i++)
	//	printf("%d ",pos[i]);puts("");
	//for(int i=1;i<=n;i++)
	//	printf("%d ",b[i]);puts("");
	int opt,x,y,z;
	for(int i=1;i<=m;i++){
		opt=read(),x=read(),y=read();
		if(opt==1)z=read(),modify(x,y,z);
		else printf("%d\n",lca(x,y));
	}
    return 0;
}

求查错,谢谢,谢谢,谢谢!!!

2021/8/20 13:02
加载中...