萌新求卡常
查看原帖
萌新求卡常
663638
Butterfly_qwq楼主2025/8/30 17:17

TLE on test 16/ll

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5,B=450;
int n,q,idx,a[N],p[N],o[N],op[N],x[N],y[N],sum[N],tag[N],rt[N],rd[N],id[N],vis[N],cnt[N],pre[1003][1003];
int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
void getrt(int v,int u){for(;!rt[v];v=o[v])rt[v]=u;}
void update(int u,int w)
{
	for(;!vis[u];u=rt[p[u]]){vis[u]=1;tag[u]+=w;}
	for(;vis[u];u=rt[p[u]])vis[u]=0;
}
signed main()
{
	n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=n;i++){p[i]=read();o[p[i]]=i;}
	q=read();
	for(int i=1;i<=q;i++){op[i]=read();x[i]=read();y[i]=read();}
	for(int l=1,r=B;l<=q;l+=B,r+=B)
	{
		r=min(r,q);
		for(int i=0;i<=n;i++)
		{
			cnt[i]=rt[i]=tag[i]=id[i]=0;
			if(i)sum[i]=sum[i-1]+a[i]; 
		}
		idx=0;
		for(int i=l;i<=r;i++)
		{
			if(op[i]>1)rt[x[i]]=x[i];
			else
			{
				if(!id[x[i]-1])id[x[i]-1]=++idx;
				if(!id[y[i]])id[y[i]]=++idx;
			}
			if(op[i]>2)rt[y[i]]=y[i]; 
		}
		idx=0;
		for(int i=1;i<=n;i++)if(rt[i]==i)
		{
			rt[i]=0;rd[++idx]=i;
			getrt(i,i);
		}
		for(int i=0;i<=n;i++)
		{
			cnt[rt[i]]++;
			for(int j=1;j<=idx;j++)pre[id[i]][j]=cnt[rd[j]];
		}
		for(int i=l,ans;i<=r;i++)
		{
			if(op[i]==1)
			{
				ans=sum[y[i]]-sum[x[i]-1];
				for(int j=1;j<=idx;j++)ans+=tag[rd[j]]*(pre[id[y[i]]][j]-pre[id[x[i]-1]][j]);
				printf("%lld\n",ans);
			}
			if(op[i]==2)update(x[i],y[i]);
			if(op[i]==3)
			{
				swap(p[x[i]],p[y[i]]);
				swap(o[p[x[i]]],o[p[y[i]]]);
			}
		}
		for(int i=1;i<=n;i++)a[i]+=tag[rt[i]];
	}
}
2025/8/30 17:17
加载中...