2025牛客多校第八场(持续更新)
B
题意:给定一些参数。和初始排列P={0,1,2,3...}.计算(n-1)次区间循环左移后的逆序对数量奇偶性
思路:
考虑对于一个排列而言,交换两个位置不同的数会对总体逆序对数量产生的影响
不妨设i<j,Pi<Pj
显然对于[0,i-1],[j,n-1]来说,交换Pi,Pj不会改变这两个区间对于逆序对的贡献
对于[i+1,j+1]这个区间,<min(Pi,Pj)即<Pi的数 以及 >max(Pi,Pj)即>Pj的数 , 在Pi和Pj改变时对逆序对贡献无变化
而对于小于Pj ,大于Pi 的数y ,设其数量为x ,那么Pi和Pj没交换之前对逆序对贡献为0
交换后 ,显然有(Pj,y),(y,Pi) 这样的逆序对贡献 , 数量为 2x
再加上(Pj,Pi)的逆序对贡献 , 那么变化后总体的逆序对数量增加了 2x+1 ,也就是奇数个,改变了逆序对数量的奇偶性
对于循环左移的操作,其实是把前面的数两两交换到后面,操作次数为(r-l) x d
const int u=((1ll<<30)-1);
void solve(){
int n,A,B,C;cin>>n>>A>>B>>C;
int a=(A&u);
int b=(B&u);
int c=(C&u);
int ans=0;
for(int i=0;i<=4*(n-1);i++){
int g = (a^((a<<16ll)&u));
int h = (g^(g>>5ll));
int tmp=c;
c=(h^((h<<1ll)&u)^b^c);
a=b;
b=tmp;
if(i<=n-1){
int k=i+(c%(n-i));
if(k!=i)ans^=1;
}
if(i==n-1){
cout<<ans;
}
if(i>=n+2&&((i-(n+2))%3)==0){
int l=min(a%n,b%n);
int r=max(a%n,b%n);
int d=(c%n)+1;
if(l==r){
cout<<ans;
}else{
if((d*(r-l))&1)ans^=1;
cout<<ans;
}
}
}
cout<<endl;
}

浙公网安备 33010602011771号