P10650 [ROI 2017] 排序幻觉 (Day 1)
Beihai_Jiang · · 题解
P10650 [ROI 2017] 排序幻觉 (Day 1)
P10650 [ROI 2017] 排序幻觉 (Day 1) - 洛谷
题目描述
给定长度为
则称
接下来有
Solution
对于
若
若
若
若
注意修改
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,q;
int a[N];
int b[2][35];
int ans,cnt;
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++){
if(a[i]==a[i+1]) continue;
int temp=a[i]^a[i+1];
int k=log2(temp);
if(a[i]<a[i+1]){
b[0][k]++;
if(b[0][k]==1 && b[1][k]>0) cnt++,ans-=pow(2,k);
}
else{
b[1][k]++;
if(b[1][k]==1 && b[0][k]>0) cnt++;
else if(b[1][k]==1) ans+=pow(2,k);
}
}
if(cnt>0)
cout<<-1<<"\n";
else
cout<<ans<<"\n";
cin>>q;
for(int i=1;i<=q;i++){
int u,y;
cin>>u>>y;
if(u-1>0 && a[u-1]!=a[u]){
int temp=a[u-1]^a[u];
int k=log2(temp);
if(a[u-1]<a[u]){
b[0][k]--;
if(!b[0][k] && b[1][k]>0) cnt--,ans+=pow(2,k);
}
else{
b[1][k]--;
if(!b[1][k] && b[0][k]>0) cnt--;
else if(!b[1][k]) ans-=pow(2,k);
}
}
if(u+1<=n && a[u]!=a[u+1]){
int temp=a[u]^a[u+1];
int k=log2(temp);
if(a[u]<a[u+1]){
b[0][k]--;
if(!b[0][k] && b[1][k]>0) cnt--,ans+=pow(2,k);
}
else{
b[1][k]--;
if(!b[1][k] && b[0][k]>0) cnt--;
else if(!b[1][k]) ans-=pow(2,k);
}
}
a[u]=y;
if(u-1>0 && a[u-1]!=a[u]){
int temp=a[u-1]^a[u];
int k=log2(temp);
if(a[u-1]<a[u]){
b[0][k]++;
if(b[0][k]==1 && b[1][k]>0) cnt++,ans-=pow(2,k);
}
else{
b[1][k]++;
if(b[1][k]==1 && b[0][k]>0) cnt++;
else if(b[1][k]==1) ans+=pow(2,k);
}
}
if(u+1<=n && a[u]!=a[u+1]){
int temp=a[u]^a[u+1];
int k=log2(temp);
if(a[u]<a[u+1]){
b[0][k]++;
if(b[0][k]==1 && b[1][k]>0) cnt++,ans-=pow(2,k);
}
else{
b[1][k]++;
if(b[1][k]==1 && b[0][k]>0) cnt++;
else if(b[1][k]==1) ans+=pow(2,k);
}
}
if(cnt>0)
cout<<-1<<"\n";
else
cout<<ans<<"\n";
}
return 0;
}