题目背景
原题题面
最近蔡徐坤非常烦恼 因为总是有人喜欢黑他
于是蔡徐坤化名菜虚鲲 暗中来到 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;
}