Codeforces - Tufurama

题目链接:Codeforces - Tufurama


主席树sb题。每次在对应版本中找大于i的个数即可。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+10,M=N*40;
int n,rt[N],sum[M],lc[M],rc[M],cnt;	long long res;
void change(int l,int r,int &x,int y,int k){
	x=++cnt; sum[x]=sum[y],lc[x]=lc[y],rc[x]=rc[y]; sum[x]++;
	if(l==r)	return ;	int mid=l+r>>1;
	if(k<=mid)	change(l,mid,lc[x],lc[y],k);
	else change(mid+1,r,rc[x],rc[y],k);
}
int ask(int l,int r,int x,int ql,int qr){
	if(l==ql&&r==qr)	return sum[x];
	int mid=l+r>>1;
	if(qr<=mid)	return ask(l,mid,lc[x],ql,qr);
	else if(ql>mid)	return ask(mid+1,r,rc[x],ql,qr);
	else return ask(l,mid,lc[x],ql,mid)+ask(mid+1,r,rc[x],mid+1,qr);
}
signed main(){
	cin>>n;
	for(int i=1,x;i<=n;i++){
		scanf("%d",&x);	res+=ask(1,1e9,rt[min(x,i-1)],i,1e9);
		change(1,1e9,rt[i],rt[i-1],x);
	}
	cout<<res;
	return 0;
}
发布了809 篇原创文章 · 获赞 246 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/105229485