Wrong answer on test 11 求调
查看原帖
Wrong answer on test 11 求调
238885
Fat_Fish楼主2021/7/17 20:41

rt,线段树+树状数组差分,第1111个点WAWA

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=4e5+100;
int n,q,a[maxn],ma[maxn],sum[maxn],add[maxn],x[maxn],y[maxn],z[maxn],k,e,d,c[maxn],b[maxn];
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(isdigit(ch)){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
inline int lowbit(int x){
	return x&-x;
}
inline void addd(int xx,int v){
	for(int i=xx;i<=n;i+=lowbit(i)){
		c[i]+=v;
	}
}
inline int summ(int xx){
	int s=0;
	for(int i=xx;i>0;i-=lowbit(i)){
		s+=c[i];
	}
	return s;
}
void pushdown(int p,int l,int r){
	if(add[p]==0){
		return;
	}
	int mid=l+r>>1;
	sum[p*2]+=(mid-l+1)*add[p];
	add[p*2]+=add[p];
	sum[p*2+1]+=(r-mid)*add[p];
	add[p*2+1]+=add[p];
	add[p]=0;
	return;
}
void build(int p,int l,int r){
	add[p]=0;
	if(l==r){
		sum[p]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	sum[p]=sum[p*2]+sum[p*2+1];
	return;
}
void modify(int p,int l,int r,int x,int y,int v){
	if(y<l||x>r){
		return;
	}
	if(x<=l&&r<=y){
		sum[p]+=(r-l+1)*v;
		add[p]+=v;
		return; 
	}
	pushdown(p,l,r);
	int mid=l+r>>1;
	modify(p*2,l,mid,x,y,v);
	modify(p*2+1,mid+1,r,x,y,v);
	sum[p]=sum[p*2]+sum[p*2+1];
	return;
}
int query(int p,int l,int r,int x,int y){
	if(y<l||x>r){
		return 0;
	}
	if(x<=l&&r<=y){
		return sum[p];
	}
	pushdown(p,l,r);
	int mid=l+r>>1;
	int s=0;
	s+=query(p*2,l,mid,x,y);
	s+=query(p*2+1,mid+1,r,x,y);
	return s; 
}
signed main(){
	n=read(),q=read(),k=read();
	for(int i=1;i<=n;++i){
		a[i]=read();
	}
	build(1,1,n);
	for(int i=1;i<=q;++i){
		x[i]=read(),y[i]=read(),z[i]=read();
	}
	for(int i=1;i<=k;++i){
		e=read(),d=read();
		addd(e,1);
		addd(d+1,-1);
	} 
	for(int i=1;i<=q;++i){
		int t=summ(i);
		if(t!=0){
			modify(1,1,n,x[i],y[i],z[i]*summ(i));
		}
	}
	for(int i=1;i<=n;++i){
		printf("%lld ",query(1,1,n,i,i));
	}
	return 0;
}
2021/7/17 20:41
加载中...