社区讨论

悬10r求条

P5692[MtOI2019] 手牵手走向明天参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mj8gedv0
此快照首次捕获于
2025/12/16 18:42
2 个月前
此快照最后确认于
2025/12/16 23:56
2 个月前
查看原帖
CPP
/*
——我们的时间,就这样开始了。
海风吹拂着面颊……纯白色的羽毛从天空中降下。

我们手牵着手仰望着天空,立下要去恋爱的誓言————
*/
#include<bits/stdc++.h>
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std;
inline int read(){
	int x=0;char ch=getchar();
	int f=1;
	for(;ch>'9'||ch<'0';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

int n,q,h,t,ans;
int a[100010],b[100010],belong[100010],L[505],R[505];
int ops[100010][505],dis[205][205][505];
int fir[205][505],las[205][505];
int s[100010][505],len[505];
inline void query(int l,int r,int x,int y){
	int ll=belong[l],rr=belong[r];
	if(x==y){
		if(ll==rr){
			for(int i=l;i<=r;i++)
				if(ops[a[i]][ll]==ops[x][ll]){
					ans=0;
					return ;
				}
			ans=1e8;
			return ;
		}
		for(int i=l;i<=R[ll];i++){
			if(ops[a[i]][ll]==ops[x][ll]){
				ans=0;
				return ;
			}
		}
		for(int i=L[rr];i<=r;i++){
			if(ops[a[i]][rr]==ops[x][rr]){
				ans=0;
				return ;
			}
		}
		for(int i=ll+1;i<=rr-1;i++){
			if(ops[x][i]!=0){
				ans=0;
				return ;
			}
		}
		ans=1e8;
		return ;
	}
	ans=1e8;
	int lx=1e9,ly=1e9;
	if(ll==rr){
		for(int i=l;i<=r;i++){
			if(ops[a[i]][ll]==ops[x][ll]){
				ans=min(ans,abs(ly-i));
				lx=i;
			}
			if(ops[a[i]][ll]==ops[y][ll]){
				ans=min(ans,abs(lx-i));
				ly=i;
			}
		}
		return ;
	}
	for(int i=l;i<=R[ll];i++){
		if(ops[a[i]][ll]==ops[x][ll]){
			ans=min(ans,abs(ly-i));
			lx=i;
		}
		if(ops[a[i]][ll]==ops[y][ll]){
			ans=min(ans,abs(lx-i));
			ly=i;
		}
	}
	for(int i=ll+1;i<=rr-1;i++){
		if(ans==1)return ;
		if(ops[x][i]!=0&&ops[y][i]!=0)
			ans=min(ans,dis[min(ops[x][i],ops[y][i])][max(ops[x][i],ops[y][i])][i]);
		if(ops[x][i]!=0)ans=min(ans,abs(fir[ops[x][i]][i]-ly));
		if(ops[y][i]!=0)ans=min(ans,abs(lx-fir[ops[y][i]][i]));
		if(ops[x][i]!=0)lx=las[ops[x][i]][i];
		if(ops[y][i]!=0)ly=las[ops[y][i]][i];
	}
	for(int i=L[rr];i<=r;i++){
		if(ops[a[i]][rr]==ops[x][rr]){
			ans=min(ans,abs(ly-i));
			lx=i;
		}
		if(ops[a[i]][rr]==ops[y][rr]){
			ans=min(ans,abs(lx-i));
			ly=i;
		}
	}
	return ;
}

inline void change(int l,int r,int x,int y){
	int ll=belong[l],rr=belong[r];
	int flag=0;
	for(int i=L[ll];i<l;i++)
		if(ops[x][ll]==ops[a[i]][ll])flag=1;
	for(int i=r+1;i<=R[ll];i++)
		if(ops[x][ll]==ops[a[i]][ll])flag=1;
	if(flag==0){
		int i=ll;
		int u=ops[x][i],v=ops[y][i];
		if(u==0){
			string ATRI="ATRI";
		}
		else if(v==0){
			ops[y][i]=ops[x][i];
			ops[x][i]=0;
		}
		else {
			fir[v][i]=min(fir[u][i],fir[v][i]);
			las[v][i]=max(las[u][i],las[v][i]);
			fir[u][i]=0;
			las[u][i]=0;
			int mx=max(u,v),mi=min(u,v);
			for(int i1=1;i1<mi;i1++){
				dis[i1][v][i]=min(dis[i1][u][i],dis[i1][v][i]);
				dis[i1][u][i]=0;
			}
			for(int i1=mi+1;i1<mx;i1++){
				if(mi==u){
					dis[i1][v][i]=min(dis[u][i1][i],dis[i1][v][i]);
					dis[u][i1][i]=0;
				}
				else {
					dis[v][i1][i]=min(dis[i1][u][i],dis[v][i1][i]);
					dis[i1][u][i]=0;
				}
			}
			for(int i1=mx+1;i1<=h;i1++){
				dis[v][i1][i]=min(dis[u][i1][i],dis[v][i1][i]);
				dis[u][i1][i]=0;
			}
			for(int i1=L[i];i1<=R[i];i1++){
				if(ops[a[i1]][i]==u)a[i1]=y;
			}
			dis[u][v][i]=0;
			s[++len[i]][i]=ops[x][i];
			ops[x][i]=0;
		}
	}
	else {
		int i=ll;
		for(int i1=l;i1<=r;i1++){
			if(ops[i1][i]==ops[x][i])break;
			if(i1==r)return ;
		}
		if(ops[y][i]==0){
			ops[y][i]=s[len[i]--][i];
		}
		for(int i1=l;i1<=r;i1++)
			if(ops[a[i1]][i]==ops[x][i])a[i1]=y;
		for(int i1=1;i1<=h;i1++)dis[min(i1,ops[x][i])][max(i1,ops[x][i])][i]=0;
		for(int i1=1;i1<=h;i1++)dis[min(i1,ops[y][i])][max(i1,ops[y][i])][i]=0;
		int llx=1e8,lly=1e8;
		for(int i1=L[i];i1<=R[i];i1++){
			if(dis[min(ops[x][i],ops[a[i1]][i])][max(ops[x][i],ops[a[i1]][i])][i]==0)dis[min(ops[x][i],ops[a[i1]][i])][max(ops[x][i],ops[a[i1]][i])][i]=abs(llx-i1);
			else dis[min(ops[x][i],ops[a[i1]][i])][max(ops[x][i],ops[a[i1]][i])][i]=min(dis[min(ops[x][i],ops[a[i1]][i])][max(ops[x][i],ops[a[i1]][i])][i],abs(llx-i1));
			if(dis[min(ops[y][i],ops[a[i1]][i])][max(ops[y][i],ops[a[i1]][i])][i]==0)dis[min(ops[y][i],ops[a[i1]][i])][max(ops[y][i],ops[a[i1]][i])][i]=abs(lly-i1);
			else dis[min(ops[y][i],ops[a[i1]][i])][max(ops[y][i],ops[a[i1]][i])][i]=min(dis[min(ops[y][i],ops[a[i1]][i])][max(ops[y][i],ops[a[i1]][i])][i],abs(lly-i1));
			if(ops[x][i]==ops[a[i1]][i])llx=i1;
			if(ops[y][i]==ops[a[i1]][i])lly=i1;
		}
		llx=1e8,lly=1e8;
		for(int i1=R[i];i1>=L[i];i1--){
			if(dis[min(ops[x][i],ops[a[i1]][i])][max(ops[x][i],ops[a[i1]][i])][i]==0)dis[min(ops[x][i],ops[a[i1]][i])][max(ops[x][i],ops[a[i1]][i])][i]=abs(llx-i1);
			else dis[min(ops[x][i],ops[a[i1]][i])][max(ops[x][i],ops[a[i1]][i])][i]=min(dis[min(ops[x][i],ops[a[i1]][i])][max(ops[x][i],ops[a[i1]][i])][i],abs(llx-i1));
			if(dis[min(ops[y][i],ops[a[i1]][i])][max(ops[y][i],ops[a[i1]][i])][i]==0)dis[min(ops[y][i],ops[a[i1]][i])][max(ops[y][i],ops[a[i1]][i])][i]=abs(lly-i1);
			else dis[min(ops[y][i],ops[a[i1]][i])][max(ops[y][i],ops[a[i1]][i])][i]=min(dis[min(ops[y][i],ops[a[i1]][i])][max(ops[y][i],ops[a[i1]][i])][i],abs(lly-i1));
			if(ops[x][i]==ops[a[i1]][i])llx=i1;
			if(ops[y][i]==ops[a[i1]][i])lly=i1;
		}
		fir[ops[x][i]][i]=0,fir[ops[y][i]][i]=0,las[ops[x][i]][i]=0,las[ops[y][i]][i]=0;
		for(int i1=L[i];i1<=R[i];i1++){
			if(ops[a[i1]][i]==ops[x][i]&&fir[ops[x][i]][i]==0)fir[ops[x][i]][i]=i1;
			if(ops[a[i1]][i]==ops[x][i])las[ops[x][i]][i]=i1;
			if(ops[a[i1]][i]==ops[y][i]&&fir[ops[y][i]][i]==0)fir[ops[y][i]][i]=i1;
			if(ops[a[i1]][i]==ops[y][i])las[ops[y][i]][i]=i1;
		}
	}
}


inline void modify(int l,int r,int x,int y){
	if(x==y)return ;
	int ll=belong[l],rr=belong[r];
	if(ll==rr){
		change(l,r,x,y);
		return ;
	}
	change(l,R[ll],x,y);
	change(L[rr],r,x,y);
	for(int i=belong[l]+1;i<=belong[r]-1;i++){
		int u=ops[x][i],v=ops[y][i];
		if(u==0)continue;
		if(v==0){
			ops[y][i]=ops[x][i];
			ops[x][i]=0;
			continue;
		}
		fir[v][i]=min(fir[u][i],fir[v][i]);
		las[v][i]=max(las[u][i],las[v][i]);
		fir[u][i]=0;
		las[u][i]=0;
		int mx=max(u,v),mi=min(u,v);
		for(int i1=1;i1<mi;i1++){
			dis[i1][v][i]=min(dis[i1][u][i],dis[i1][v][i]);
			dis[i1][u][i]=0;
		}
		for(int i1=mi+1;i1<mx;i1++){
			if(mi==u){
				dis[i1][v][i]=min(dis[u][i1][i],dis[i1][v][i]);
				dis[u][i1][i]=0;
			}
			else {
				dis[v][i1][i]=min(dis[i1][u][i],dis[v][i1][i]);
				dis[i1][u][i]=0;
			}
		}
		for(int i1=mx+1;i1<=h;i1++){
			dis[v][i1][i]=min(dis[u][i1][i],dis[v][i1][i]);
			dis[u][i1][i]=0;
		}
		for(int i1=L[i];i1<=R[i];i1++){
			if(ops[a[i1]][i]==u)a[i1]=y;
		}
		dis[u][v][i]=0;
		s[++len[i]][i]=ops[x][i];
		ops[x][i]=0;
	}
	return ;
} 

int main(){
	n=read(),q=read();
	h=200,t=n/h;
	if(n%h)t++;
	for(int i=1;i<=n;i++)a[i]=read(),belong[i]=(i-1)/h+1;
	for(int i=1;i<=t;i++){
		L[i]=(i-1)*h+1;
		R[i]=min(n,i*h);
	}
	for(int i=1;i<=t;i++){
		for(int j=L[i];j<=R[i];j++)b[j]=a[j];
		sort(b+L[i],b+R[i]+1);
		int lenn=0;
		ops[b[L[i]]][i]=++lenn;
		for(int j=L[i]+1;j<=R[i];j++){
			if(b[j]!=b[j-1])ops[b[j]][i]=++lenn;
		}
		int yy=h+1;
		while(ops[b[R[i]]][i]!=yy)s[++len[i]][i]=yy,yy--;
		for(int j=L[i];j<=R[i];j++){
			if(fir[ops[a[j]][i]][i]==0)fir[ops[a[j]][i]][i]=j;
			las[ops[a[j]][i]][i]=j;
		}
		for(int i1=L[i];i1<=R[i];i1++){
			for(int i2=L[i];i2<=i1-1;i2++){
				if(ops[a[i1]][i]==ops[a[i2]][i])continue;
				if(dis[min(ops[a[i1]][i],ops[a[i2]][i])][max(ops[a[i1]][i],ops[a[i2]][i])][i]==0||
				dis[min(ops[a[i1]][i],ops[a[i2]][i])][max(ops[a[i1]][i],ops[a[i2]][i])][i]>abs(i1-i2)){
					dis[min(ops[a[i1]][i],ops[a[i2]][i])][max(ops[a[i1]][i],ops[a[i2]][i])][i]=abs(i1-i2);
				}
			}
		}
	}
	h++;
	while(q--){
		int opt=read(),l=read(),r=read(),x=read(),y=read();
		if(opt==1)modify(l,r,x,y);
		else {
			ans=0;
			query(l,r,x,y);
			if(ans==1e8)cout<<-1<<'\n';
			else cout<<ans<<'\n';
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...