树状数组又WA又T求助
查看原帖
树状数组又WA又T求助
332022
ChthollyMeow楼主2020/5/26 22:37
  • 大概就是用树状数组
  • 关于卡常:
  • registerinline全加了
  • O2开了
  • 快读开了
  • 然鹅仍然有几个点TLE,有时候rp高会变成WA(
  • 代码如下:
#include<bits/stdc++.h>
#define RE register
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){
	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;
}
int 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+=i-find(b[i]-1);
	}
	printf("%d",anss);
	return 0;
}
2020/5/26 22:37
加载中...