TLE求调
查看原帖
TLE求调
784856
Comars楼主2024/12/18 19:39

rt.
TLE*2,应该是哪个地方写挂了。

#include<bits/stdc++.h>
using namespace std;
typedef long long int64;
struct query{
	int l,r,id;
}q[10005];
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int a[100005],b[100005],k,n,p[100005],len,s[100005],g[200005],c[100005],d[100005],m;
int64 ans[10005],res;
bool cmp(query a,query b){return p[a.l]!=p[b.l]?p[a.l]<p[b.l]:(p[a.l]&1?a.r<b.r:a.r>b.r);}
struct binarytree{
	int64 t[200005];
	int lowbit(int i){return (i&(-i));}
	void update(int x,int y){
		for(int i=x;i<=m;i+=lowbit(i)) t[i]+=y;
	}
	int64 querysum(int x){
		int64 ret=0;
		for(int i=x;i;i-=lowbit(i)) ret+=t[i];
		return ret;
	}
	int64 getsum(int l,int r){return querysum(r)-querysum(l-1);}
}tas,tac,tbs,tbc;
void adda(int x){
	res+=tbc.getsum(1,c[x])*a[x]-tbs.getsum(1,c[x]);
	res+=tbs.getsum(c[x]+1,m)-a[x]*tbc.getsum(c[x]+1,m);
	tac.update(c[x],1),tas.update(c[x],a[x]);
}
void dela(int x){
	res-=tbc.getsum(1,c[x])*a[x]-tbs.getsum(1,c[x]);
	res-=tbs.getsum(c[x]+1,m)-a[x]*tbc.getsum(c[x]+1,m);
	tac.update(c[x],-1),tas.update(c[x],-a[x]);
}
void addb(int x){
	res+=tac.getsum(1,d[x])*b[x]-tas.getsum(1,d[x]);
	res+=tas.getsum(d[x]+1,m)-b[x]*tac.getsum(d[x]+1,m);
	tbc.update(d[x],1),tbs.update(d[x],b[x]);
}
void delb(int x){
	res-=tac.getsum(1,d[x])*b[x]-tas.getsum(1,d[x]);
	res-=tas.getsum(d[x]+1,m)-b[x]*tac.getsum(d[x]+1,m);
	tbc.update(d[x],-1),tbs.update(d[x],-b[x]);
}
signed main(){
	n=read();
	len=3000;
	for(int i=1;i<=n;i++) a[i]=read(),g[++m]=a[i];
	for(int i=1;i<=n;i++) b[i]=read(),g[++m]=b[i];
	for(int i=1;i<=n;i++) p[i]=(i-1)/len+1;
	sort(g+1,g+m+1);
	m=unique(g+1,g+m+1)-g-1;
	for(int i=1;i<=n;i++) c[i]=lower_bound(g,g+m+1,a[i])-g;
	for(int i=1;i<=n;i++) d[i]=lower_bound(g,g+m+1,b[i])-g;
	k=read();
	for(int i=1;i<=k;i++) q[i].l=read(),q[i].r=read(),q[i].id=i;
	sort(q+1,q+k+1,cmp);
	int l=0,r=0;
	for(int i=1;i<=k;i++){
		while(q[i].l>l) adda(++l);
		while(q[i].r>r) addb(++r);
		while(q[i].l<l) dela(l--);
		while(q[i].r<r) delb(r--);
		ans[q[i].id]=res;
	}
	for(int i=1;i<=k;i++) cout<<ans[i]<<"\n";
	return 0;
}
2024/12/18 19:39
加载中...