求助,后五十个点全WA,显示读到负号
  • 板块P1908 逆序对
  • 楼主DuskLight
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/8/23 23:03
  • 上次更新2023/11/4 09:16:21
查看原帖
求助,后五十个点全WA,显示读到负号
534690
DuskLight楼主2021/8/23 23:03

评测点

#include<iostream>  //树状数组做法
#include<cstring>
#include<cstdio>
#include<algorithm>
#define f(a,b,c) for(int a=b;a<=c;a++)
#define lowbit(a) ((a)&(-a))
#define maxn 1000005
#define ll unsigned long long
using namespace std;
ll fread(){
    ll x=0,s=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')s=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0'){
        x=x*10+(ch-'0');
        ch=getchar();
    }
    return s==1?x:-x;
}

ll tree[maxn],a[maxn],b[maxn],n;
unsigned long long answer=0;

void add(ll index,ll x){
       ll i=index;
       for(;i<=n;i+=lowbit(i)){
        tree[i]+=x;
       }
}
bool com (ll u, ll v){
	if(a[u]==a[v])return u>v;
	return a[u]>a[v];
}
ll sum(ll x){

    ll i=x,ans=0;

    for(;i>0;i-=lowbit(i)){

        ans+=tree[i];
    }

    return ans;
}
int main()
{
    n=fread();
    f(i,1,n){
        a[i]=fread();
        b[i]=i;
    }
    sort(b+1,b+n+1,com);
	f(i,1,n){
    add(b[i],1);                    
    answer+=sum(b[i]-1);
    }
    printf("%d",answer);
    return 0;
}
2021/8/23 23:03
加载中...