主席树求调
查看原帖
主席树求调
1032391
ICE__LX楼主2025/2/5 20:17

主席树不知道错哪了,作差出了负数!

#include<bits/stdc++.h>
using namespace std;
#define I_love_Foccarus return
#define in(a) a=read()
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define deap(i,a,b) for(int i=b;i>=a;i--)
#define pii pair<int,int>
#define mk(a,b) make_pair(a,b)
#define fi first
#define se second
#define pd(a) push_back(a)
//#define int long long
const int N = 1e5 + 5;
const int inf = INT_MAX;
inline int read() {
	int ch=getchar(),f=1,x=0;
	while('9'<ch||ch<'0') {
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while('0'<=ch&&ch<='9') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
void fast() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
}
struct linetree {
	int v,cl,cr;
};

vector<linetree>t;
int rt[N];
int change(int idx,int l,int r,int q,int val){
	linetree tmp=t[idx];
	if(l==r){
		tmp.v+=val;
		t.push_back(tmp);
		return t.size()-1;
	}
	int mid=(l+r)>>1;
	if(q<=mid)tmp.cl=change(t[idx].cl,l,mid,q,val);
	else tmp.cr=change(t[idx].cr,mid+1,r,q,val);
	tmp.v=t[tmp.cl].v+t[tmp.cr].v;
	t.push_back(tmp);
	return t.size()-1;
}
int query(int idxl,int idxr,int l,int r,int q){
    if(l==r)return 0;
    int mid=(l+r)>>1;
    if(q<=mid)return t[t[idxr].cr].v-t[t[idxl].cr].v+query(t[idxl].cl,t[idxr].cr,l,mid,q);
    else return query(t[idxl].cr,t[idxr].cr,mid+1,r,q);
}
int qry(int idxl,int idxr,int l,int r,int q){
    if(l==r)return 0;
    int mid=(l+r)>>1;
    if(q<=mid)return qry(t[idxl].cl,t[idxr].cr,l,mid,q);
    else return t[t[idxr].cl].v-t[t[idxl].cl].v+qry(t[idxl].cr,t[idxr].cr,mid+1,r,q);
}
int a[N],szl[N],szr[N];
signed main() {
	//fast();
	int n,tot=1e5,ans=0;
	in(n);
	linetree tmp;
	tmp.v=tmp.cl=tmp.cr=0;
	t.push_back(tmp);
	rep(i,1,n) {
		in(a[i]);
		rt[i]=change(rt[i-1],1,tot,a[i],1);
	}
	rep(i,1,n)szl[i]=qry(rt[0],rt[i],1,tot,a[i]);
    deap(i,1,n)szr[i]=query(rt[i-1],rt[n],1,tot,a[i]);
    rep(i,1,n)ans+=szl[i]*szr[i];
    cout<<ans;
	I_love_Foccarus 0;
}
2025/2/5 20:17
加载中...