某idol的人气调查

题目背景

原题题面

最近蔡徐坤非常烦恼 因为总是有人喜欢黑他

于是蔡徐坤化名菜虚鲲 暗中来到 x湖一中进行人气调查

这个学校的学生对于蔡徐坤有这样的特点

一开始每个人的恶意值都为0

如果一个人黑他 这个学生周围的一片人 就会累加 x点恶意值

蔡徐坤会随机时间调查一群人的恶意值最大的那个人

当蔡徐坤看不下去了就会给一部分人发律师函警告 这些学生的恶意值就会清零

由于鸡你实在是太美

请你这只鸡模拟这一过程

题目描述 & 格式

第一行 n表示学生数 m表示事件个数

接下来m行

每行3或4个数 op,L,R (v)

若op=1 请输出区间[L,R][L,R]的恶意最大值

若op=2 表示将区间[L,R][L,R]恶意值清零

若op=3 表示区间[L,R][L,R]内的学生恶意值都加vv

样例

输入

5 4
3 1 4 4
1 2 3
2 2 2
1 2 3

输出

4
4

数据范围

25%的点没有2操作

另有25%的点 n,m≤10^4
n,m≤10^6 所有值在int以内

【AC代码】:

#include <bits/stdc++.h>
#define M(a, b) memset(a, b, sizeof(a))
#define INF 0x3f3f3f3f
#define MOD 200907
using namespace std;
inline void read(long long &x){
    char ch=getchar(),c=ch;
	x=0;
    while(ch<'0' || ch>'9'){
    	 c=ch;
		 ch=getchar();
	}
    while(ch>='0' && ch<='9'){
    	x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
    if(c=='-')x=-x;
}

typedef long long ll;
const int N=1000009;
ll n,m,tree[N*4],lazy1[N*4],lazy2[N*4];

ll ls(ll x){
	return x<<1;
}

ll rs(ll x){
	return x<<1|1;
}

void pushup(ll x){
	tree[x]=max(tree[ls(x)],tree[rs(x)]);
	return ;
}

void build(ll x,ll l,ll r){
	lazy1[x]=0;lazy2[x]=1;
	if(l==r){tree[x]=0;return ;}
	ll mid=(l+r)>>1;
	build(ls(x),l,mid);
	build(rs(x),mid+1,r);
	return ;
}

void pd_mul(ll x,ll k){
	lazy2[x]*=k;
	lazy1[x]*=k;
	tree[x]*=k;
	return ;
}

void pd_add(ll x,ll k){
	lazy1[x]+=k;
	tree[x]+=k;
	return ;
}

void pushdown(ll x,ll l,ll r){
	if(l==r)return ;
    pd_mul(ls(x),lazy2[x]);
	pd_mul(rs(x),lazy2[x]);
	pd_add(ls(x),lazy1[x]);
	pd_add(rs(x),lazy1[x]);
	lazy1[x]=0;lazy2[x]=1;
}

void modify_add(ll x,ll k,ll l,ll r,ll a,ll b){
	if(l>b||r<a)return ;
	if(a<=l&&r<=b){
		lazy1[x]+=k;
		tree[x]+=k;
		return ;
	}
	pushdown(x,l,r);
	ll mid=(l+r)>>1;
	if(a<=mid)modify_add(ls(x),k,l,mid,a,b);
	if(b>mid)modify_add(rs(x),k,mid+1,r,a,b);
	pushup(x);
}

void modify_mul(ll x,ll k,ll l,ll r,ll a,ll b){
	if(l>b||r<a)return ;
	if(a<=l&&r<=b){
		lazy2[x]*=k;lazy1[x]*=k;
		tree[x]*=k;
		return ;
	}
	pushdown(x,l,r);
	ll mid=(l+r)>>1;
	if(a<=mid)modify_mul(ls(x),k,l,mid,a,b);
	if(b>mid)modify_mul(rs(x),k,mid+1,r,a,b);
	pushup(x);
}

ll query(ll x,ll l,ll r,ll a,ll b){
	ll ma=-2147483647;
	if(a<=l&&r<=b)return tree[x];
	pushdown(x,l,r);
	ll mid=(l+r)>>1;
	if(a<=mid)ma=max(ma,query(ls(x),l,mid,a,b));
	if(b>mid)ma=max(ma,query(rs(x),mid+1,r,a,b));
	return ma;
}

int main(){
	read(n),read(m);
	build(1,1,n);
	while(m--){
		ll s,x,y,z;
		read(s);
		if(s==1){
			read(x);
			read(y);
			printf("%lld\n",query(1,1,n,x,y));
		}
		if(s==2){
			read(x);
			read(y);
			modify_mul(1,0,1,n,x,y);
		}
		if(s==3){
			read(x);
			read(y);
			read(z);
			modify_add(1,z,1,n,x,y);
		}
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值