社区讨论
悬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 条回复,欢迎继续交流。
正在加载回复...