昨晚ABC G 求调
  • 板块学术版
  • 楼主xiao7_Mr_10_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/15 10:25
  • 上次更新2024/12/15 13:17:33
查看原帖
昨晚ABC G 求调
961149
xiao7_Mr_10_楼主2024/12/15 10:25

老是 RE 4个点,这是 提交记录

思路就是暴力莫队,检查了一下不是树状数组的问题,但是就是那 4 个点有问题求解释。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
struct Point{
	int l,r,id;
}wt[N];
int n,a[N],q,b[N],len,c[N],sum[N],d[N],f[N],ans,ans1[N];
struct tree{
	int c[N];
	int query(int x){int ans=0;
		for(;x;x-=x&(-x))ans+=c[x];return ans;
	}
	void add(int x,int y){
		for(;x<=len;x+=x&(-x))c[x]+=y;
	}
}f1,f2,f3,f4;
int fk;
bool cmp(Point x,Point y){
	if(x.l/fk==y.l/fk)return x.r<y.r;
	return x.l<y.l;
}
void movel(int x,int val){
	if(!x)cout <<"利群";
	ans+=val*(f1.query(x)*c[x]-f2.query(x)+(f2.query(len)-f2.query(x))-(f1.query(len)-f1.query(x))*c[x]);
	f3.add(x,val);f4.add(x,c[x]*val);
}
void mover(int x,int val){
	if(!x)cout << "利群"
	ans+=val*(f3.query(x)*c[x]-f4.query(x)+(f4.query(len)-f4.query(x))-(f3.query(len)-f3.query(x))*c[x]);
	f1.add(x,val),f2.add(x,c[x]*val);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin >> n;
	for(int i = 1;i <= n;i++)cin >> a[i],c[++len]=a[i];
	for(int i = 1;i <= n;i++)cin >> b[i],c[++len]=b[i];
	sort(c+1,c+1+len);
	len=unique(c+1,c+1+len)-c-1;
	for(int i = 1;i <= n;i++){
		a[i]=lower_bound(c+1,c+1+len,a[i])-c;
		b[i]=lower_bound(c+1,c+1+len,b[i])-c;
	}cin >> q;fk=n/sqrt(q);
	for(int i = 1;i <= q;i++){
		cin >> wt[i].l >> wt[i].r;
		wt[i].id=i;
	}sort(wt+1,wt+1+q,cmp);
	int l = 0,r=0;
	for(int i = 1;i <= q;i++){
	//	cout << "work" << i <<" " << l <<" " <<r  <<"\n";
		for(;l<wt[i].l;)movel(a[++l],1);
	//	cout << ans << "\n";
		for(;l>wt[i].l;)movel(a[l--],-1);
		//cout << ans << "\n";
		for(;r<wt[i].r;)mover(b[++r],1);
	//	cout << ans << "\n";
		for(;r>wt[i].r;)mover(b[r--],-1);
		ans1[wt[i].id]=ans;//cout << ans << "\n";
	}for(int i= 1;i <= q;i++)cout << ans1[i] << "\n";
	return 0;
}
2024/12/15 10:25
加载中...