0 pts 求条或hack
查看原帖
0 pts 求条或hack
636936
tyccyt楼主2025/2/2 19:13
#include <bits/stdc++.h>
using namespace std;
#define il inline
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)>(b)?(b):(a))
#define Abs(x) ((x)>0?(x):-(x)) 
const int N=1e5+5,B=350;
int n,q,a[N],s[N],lsans=0;//s[i]:i在块内的离散化编号
int num[B][N],x,y;//num[i][j]:在第i块j的离散化编号 
int L[B],R[B],bl,tot;//分块正常预处理数组 
int st[B][B],ed[B][B];//st[i][j]:在第i块,j第一次出现的位置,ed[i][j]:在第i块,j最后出现的位置 
vector<int>t[B];//用来离散化的vector
short f[B][B][B];//f[i][j][k]:表示第i块,j和k的答案 
int len[B];//第i块目前的颜色总数 
int cnt[N];//apr[i]:i出现次数 
bool vis[B][N];//vis[i][j]在第i块,是否出现j 
il void init()//预处理出所有需要的数组 
{
	bl=sqrt(n);tot=(n-1)/bl+1;
	for(int i=1;i<=tot;i++)L[i]=R[i-1]+1,R[i]=(i==tot?n:i*bl);
	for(int i=1;i<=tot;i++)//进行离散化 
	{
		for(int j=L[i];j<=R[i];j++)t[i].push_back(a[j]);
		sort(t[i].begin(),t[i].end());
		len[i]=unique(t[i].begin(),t[i].end())-t[i].begin();
		for(int j=L[i];j<=R[i];j++)s[j]=lower_bound(t[i].begin(),t[i].end(),a[j])-t[i].begin()+1;
	}
	for(int i=1;i<=tot;i++)//预处理出st和ed 
	{
		for(int j=L[i];j<=R[i];j++)
		{
			vis[i][a[j]]=1;
			num[i][a[j]]=s[j];
			ed[i][s[j]]=j;
			if(!st[i][s[j]])st[i][s[j]]=j;
		}
	}
//	cout<<st[3][2]<<' '<<ed[3][2]<<'\n';
	for(int i=0;i<=tot;i++)for(int j=0;j<=len[i];j++)for(int k=0;k<=len[i];k++)f[i][j][k]=B; //初始化f 
	for(int i=1;i<=tot;i++)//直接暴力处理f数组 
	{
		for(int j=L[i];j<=R[i];j++)
		{
			for(int k=L[i];k<=R[i];k++)
			{
				f[i][s[j]][s[k]]=Min(f[i][s[j]][s[k]],Abs(j-k));
			}
		}
	}
	return;
}
il void change()//修改操作 
{
	cnt[y]=1,cnt[x]=0;
	for(int i=1,idx,idy;i<=tot;i++)
	{
		if(len[i]==1)
		{
			if(vis[i][x])
			{
				vis[i][y]=1,vis[i][x]=0,num[i][y]=num[i][x],num[i][x]=0;
			}
			continue;
		}
		if(!vis[i][x])continue;
		if(!vis[i][y])
		{
			vis[i][y]=1,vis[i][x]=0,num[i][y]=num[i][x];num[i][x]=0;
			continue;
		}
		vis[i][y]=1,vis[i][x]=0;
		idx=num[i][x],idy=num[i][y];
		st[i][idy]=Min(st[i][idy],st[i][idx]);
		st[i][idx]=n+1;
		ed[i][idy]=Max(ed[i][idy],ed[i][idx]);
		ed[i][idx]=0;
		for(int j=L[i],tt;j<=R[i];j++)
		{
			tt=num[i][a[j]];
            f[i][idy][tt]=f[i][tt][idy]=Min(f[i][idy][tt],f[i][idx][tt]);
			f[i][idx][tt]=f[i][tt][idx]=B;
		}
		num[i][x]=num[i][y];
		len[i]--; 
	}
	return;
}
il void query()//查询操作 
{
	int ans=n+1,lsx=0,lsy=0;
	for(int i=1;i<=tot;i++)
	{
		if(vis[i][x]&&vis[i][y])ans=Min(ans,f[i][num[i][x]][num[i][y]]);
		if(lsx&&vis[i][y])ans=Min(ans,Abs(lsx-st[i][num[i][y]]));
		if(vis[i][x])lsx=ed[i][num[i][x]];
		if(lsy&&vis[i][x])ans=Min(ans,Abs(lsy-st[i][num[i][x]]));
		if(vis[i][y])lsy=ed[i][num[i][y]];
	}
	if(ans==n+1)cout<<"Ikaros\n";
	else cout<<ans<<'\n';
	if(ans==n+1)ans=0;
	lsans=ans;
	return;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];cnt[a[i]]=1; 
	}
	init();
	int op;
	while(q--)
	{
		cin>>op>>x>>y;
		x^=lsans,y^=lsans;
		if(x==y)
		{
			if(op==2)
			{
				if(cnt[x])cout<<"0\n";
				else cout<<"Ikaros\n";
				lsans=0;
			}
			continue;
		}
		if(op==1)change();
		else query();
	}
	return 0;
}
2025/2/2 19:13
加载中...