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;
}
posted @ 2025-08-07 19:44  Marinaco  阅读(33)  评论(0)    收藏  举报
//雪花飘落效果