2 条题解

  • 0
    @ 2025-10-8 16:56:23
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=2e5+10;
    int n,a[N],c[N+1],L[N];
    //L[i]表示对于a[i]左边有多少个比它小
    int lowbit(int x){return x&(-x);}
    void add(int x,int k){for(;x<=n;x+=lowbit(x))c[x]+=k;}
    int getsum(int x){int res=0;for(;x>=1;x-=lowbit(x))res+=c[x];return res;}
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        memset(c,0,sizeof(c));
        for(int i=1;i<=n;i++)add(a[i],1),L[i]=getsum(a[i]-1);
    
        LL ans=0;
    	for(int i=2;i<n;i++)
    	{
    		ans+=LL(i-1-L[i])*(n-a[i]-(i-1-L[i]));
    	}
        printf("%lld ",ans);
        ans=0;
    	for(int i=2;i<n;i++)
    	{
    		ans+=LL(L[i])*(a[i]-1-L[i]);
    	}
        printf("%lld\n",ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:56:15
      #include<bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      const int N=2e5+10;
      int n,a[N],c[N+1],L[N];
      //L[i]表示对于a[i]左边有多少个比它小
      int lowbit(int x){return x&(-x);}
      void add(int x,int k){for(;x<=n;x+=lowbit(x))c[x]+=k;}
      int getsum(int x){int res=0;for(;x>=1;x-=lowbit(x))res+=c[x];return res;}
      int main()
      {
          scanf("%d",&n);
          for(int i=1;i<=n;i++)scanf("%d",&a[i]);
          memset(c,0,sizeof(c));
          for(int i=1;i<=n;i++)add(a[i],1),L[i]=getsum(a[i]-1);
      
          LL ans=0;
      	for(int i=2;i<n;i++)
      	{
      		ans+=LL(i-1-L[i])*(n-a[i]-(i-1-L[i]));
      	}
          printf("%lld ",ans);
          ans=0;
      	for(int i=2;i<n;i++)
      	{
      		ans+=LL(L[i])*(a[i]-1-L[i]);
      	}
          printf("%lld\n",ans);
          return 0;
      }
      • 1

      信息

      ID
      1324
      时间
      1000ms
      内存
      64MiB
      难度
      6
      标签
      递交数
      109
      已通过
      35
      上传者