CDQ 求调
查看原帖
CDQ 求调
762117
快速数论变换楼主2025/7/22 16:13

只有 50 pts,其他全超时。

#include<bits/stdc++.h>
using namespace std;
constexpr int N=5e5+5;
struct _{
	int t,v,p,id;
	_()=default;
	_(int t,int v,int p,int id):t(t),v(v),p(p),id(id){}
};
_ I[N];
map<int,int> mp;
long long ans[1];
int a[N],bit[N],n,tot=0;
inline int lowbit(int qwq){
	return qwq&-qwq;
}
inline void add(int p,int v){
	for(;p<=n;p+=lowbit(p)) bit[p]+=v;
	return;
}
inline int query(int p){
	int res=0;
	for(;p;p-=lowbit(p)) res+=bit[p];
	return res;
}
inline void solve(int l,int r){
	if(l==r) return;
	int mid=(l+r)>>1,j;
	solve(l,mid),solve(mid+1,r);
	sort(I+l,I+mid+1,[](const _& a,const _& b)->bool{
		return a.v<b.v;
	});
	sort(I+mid+1,I+r+1,[](const _& a,const _& b)->bool{
		return a.v<b.v;
	});
	j=l;
	for(int i=mid+1;i<=r;++i){
		while(j<=mid&&I[j].v<I[i].v) add(I[j].p,1),++j;
		ans[I[i].id]+=query(n)-query(I[i].p);
	}
	for(int i=l;i<j;++i) add(I[i].p,-1);
	sort(I+l,I+mid+1,[](const _& a,const _& b)->bool{
		return a.p<b.p;
	});
	sort(I+mid+1,I+r+1,[](const _& a,const _& b)->bool{
		return a.p<b.p;
	});
	j=l;
	for(int i=mid+1;i<=r;++i){
		while(j<=mid&&I[j].p<I[i].p) add(I[j].v,1),++j;
		ans[I[i].id]+=query(n)-query(I[i].v);
	}
	for(int i=l;i<j;++i) add(I[i].v,-1);
	return;
}
signed main(){
	ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
	cin>>n;;
	for(int i=1;i<=n;++i) cin>>a[i],I[i]=_(i,a[i],i,0),mp[a[i]];
    for(auto& i:mp) i.second=++tot;
    for(int i=1;i<=n;++i) I[i].v=mp[I[i].v];
	solve(1,n);
	cout<<ans[0]<<'\n';
	return 0;
}
2025/7/22 16:13
加载中...