mxqz,WA70分
  • 板块P2122 还教室
  • 楼主_zdc_
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/10/19 16:18
  • 上次更新2023/11/4 03:17:33
查看原帖
mxqz,WA70分
431487
_zdc_楼主2021/10/19 16:18

记录

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int N=1e5+5;
int n,m,opt,x,y,k,a[N],sum[4*N],sum2[4*N],tag[4*N];
void push_up(int cur){
	sum[cur]=sum[cur<<1]+sum[cur<<1|1];
	sum2[cur]=sum2[cur<<1]+sum2[cur<<1|1];
	return;
}
void build(int cur,int lt,int rt){
	if(lt==rt){
		sum[cur]=a[lt];
		sum2[cur]=a[lt]*a[lt];
		return;
	}
	int mid=lt+rt>>1;
	build(cur<<1,lt,mid);
	build(cur<<1|1,mid+1,rt);
	push_up(cur);
	return;
}
void add_tag(int cur,int lt,int rt,int val){
	tag[cur]+=val;
	sum2[cur]+=(rt-lt+1)*val*val+2*sum[cur]*val;
	sum[cur]+=(rt-lt+1)*val;
	return;
}
void push_down(int cur,int lt,int rt){
	if(!tag[cur]) return;
	int mid=lt+rt>>1;
	add_tag(cur<<1,lt,mid,tag[cur]);
	add_tag(cur<<1|1,mid+1,rt,tag[cur]);
	tag[cur]=0;
	return;
}
void update(int cur,int lt,int rt,int qx,int qy,int val){
	if(rt<qx || lt>qy) return;
	if(lt>=qx && rt<=qy){
		add_tag(cur,lt,rt,val);
		return;
	}
	push_down(cur,lt,rt);
	int mid=lt+rt>>1;
	update(cur<<1,lt,mid,qx,qy,val);
	update(cur<<1|1,mid+1,rt,qx,qy,val);
	push_up(cur);
	return;
}
int query(int cur,int lt,int rt,int qx,int qy){
	if(rt<qx || lt>qy) return 0;
	if(lt>=qx && rt<=qy) return sum[cur];
	push_down(cur,lt,rt);
	int mid=lt+rt>>1;
	return query(cur<<1,lt,mid,qx,qy)+query(cur<<1|1,mid+1,rt,qx,qy);
}
int query2(int cur,int lt,int rt,int qx,int qy){
	if(rt<qx || lt>qy) return 0;
	if(lt>=qx && rt<=qy) return sum2[cur];
	push_down(cur,lt,rt);
	int mid=lt+rt>>1;
	return query2(cur<<1,lt,mid,qx,qy)+query2(cur<<1|1,mid+1,rt,qx,qy);
}
int gcd(int x,int y){
	if(x>y) swap(x,y);
	return !x?y:gcd(y%x,x);
}
void print(int x,int y){
	if(!x){
		cout<<"0/1\n";
		return;
	}
	k=gcd(x,y);
	cout<<x/k<<'/'<<y/k<<'\n';
	return;
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(m--){
		cin>>opt>>x>>y;
		if(opt==1){
			cin>>k;
			update(1,1,n,x,y,k);
		}else if(opt==2) print(query(1,1,n,x,y),y-x+1);
		else print(query2(1,1,n,x,y)*(y-x+1)-pow(query(1,1,n,x,y),2),pow(y-x+1,2));
	}
	return 0;
}
2021/10/19 16:18
加载中...