树状数组又WA又T求助

P1908 逆序对

啊,这代码现在不会TLE了,不过全WA
by ChthollyMeow @ 2020-05-26 22:38:00


@[_珂朵莉](/user/332022) 1.$cmp$ 写错了,应该是 $a_p>a_q$ 而且数据已加强需要判重,所以这样 ```cpp bool cmp(int p,int q){ if(a[p]==a[q]) return p>q; return a[p]>a[q]; } ``` 2.数据加强,要开 $long\ long$
by Acestar @ 2020-05-26 23:14:51


```cpp #include<bits/stdc++.h> #define RE register #define int long long using namespace std; int a[500005],b[500005],c[500005],n,anss=0; inline void modify(RE int x){ for(RE int i=x;i<=n;i+=(i&(-i))){ c[i]++; } } inline int find(RE int x){ RE int ans=0; for(RE int i=x;i;i-=(i&(-i))){ ans+=c[i]; } return ans; } bool cmp(int p,int q){ if(a[p]==a[q]) return p>q; return a[p]>a[q]; } inline int read(){ char ch=getchar(); int x=0,f=1; while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*f; } signed main(){ n=read(); for(RE int i=1;i<=n;i++){ a[i]=read(); b[i]=i;//离散化 } sort(b+1,b+n+1,cmp); for(RE int i=1;i<=n;i++){ modify(b[i]); anss+=find(b[i]-1); } printf("%lld",anss); return 0; } ```
by Acestar @ 2020-05-26 23:15:13


|