题目链接: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;
}