2 solutions

  • 1
    @ 2026-7-30 19:32:52
    #include<bits/stdc++.h>
    using namespace std;
    int n,nex[15000005][2],cnt,siz[15000005];
    long long ans;
    void insert(int s){
        int p=0;
        for(int i=29;i>=0;i--){
            int c=(s>>i)&1;
            if(c==0)ans+=siz[nex[p][1]];
            if(!nex[p][c])nex[p][c]=++cnt;
            p=nex[p][c];
            siz[p]++;
        }
    }
    signed main(){
        cin>>n;
        for(int a,i=1;i<=n;i++){
            cin>>a;
            insert(a);
        }
        cout<<ans;
        return 0;
    }
    
    • 1
      @ 2025-8-19 9:10:14
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e5+10;
      int q[N],temp[N];
      typedef long long LL;
      LL merge_sort(int l,int r)
      {
          if(l>=r) return 0;
          int mid=l+r>>1;
          LL res=0;
          res+=merge_sort(l,mid); //左边的逆序对数目
          res+=merge_sort(mid+1,r); //右边的逆序对数目
          int i=l,j=mid+1;
          int idx=0;
          while(i<=mid&&j<=r)
          {
              if(q[i]<=q[j]) temp[idx++]=q[i++];
              else
              {
                  res+=mid-i+1;//加上q[j]和左边序列构成的逆序对数目
                  temp[idx++]=q[j++];
              }
          }
          while(i<=mid) temp[idx++]=q[i++]; //左边还没有放完
          while(j<=r) temp[idx++]=q[j++]; //右边还没有放完
          for(int i=l,idx=0;i<=r;i++,idx++) //按照顺序放到原位置
          {
              q[i]=temp[idx];
          }
          return res; //返回l到r这段的逆序对数目
      }
      int main()
      {
          int n;
          cin>>n;
          for(int i=1;i<=n;i++)
          {
              cin>>q[i];
          }
          cout<<merge_sort(1,n);
          return 0;
      }
      
      • 1

      Information

      ID
      328
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      5
      Tags
      # Submissions
      30
      Accepted
      11
      Uploaded By