社区讨论
求条,only ac on #1#3
P1253扶苏的问题参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi5zuvdm
- 此快照首次捕获于
- 2025/11/19 20:44 3 个月前
- 此快照最后确认于
- 2025/11/21 00:00 3 个月前
指针写的,应该有可读性吧(大嘘
CPP#include"bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<ll,ll>PLL;
const ll maxn=1e6+10,mod=1e9+7,inf=0x3f3f3f3f3f3f;
#define lid(x) x<<1
#define rid(x) x<<1|1
struct node{
node *leftKid,*rightKid;
ll l,r,val,tag,addTag;
};
ll a[maxn<<2],n,opt,x,q;
struct tree{
node *root;
node *newNode(ll l,ll r){
node* cur=new node();
cur->l=l;
cur->r=r;
cur->val=0;
cur->tag=cur->addTag=-1;
cur->leftKid=cur->rightKid=nullptr;
return cur;
}
void build(node *&cur,ll l,ll r){
ll mid=l+r>>1;
cur=newNode(l,r);
if(l==r){
// cout<<1<<' ';
cur->val=a[l];
return ;
}//cout<<l<<' '<<r<<endl;
build(cur->leftKid,l,mid);
build(cur->rightKid,mid+1,r);
// cout<<1<<' ';
cur->val=max(cur->leftKid->val,cur->rightKid->val);
}void pushUpAdd(node *cur){
if(cur->addTag==-1)return ;
cur->leftKid->val+=cur->addTag;
cur->rightKid->val+=cur->addTag;
cur->leftKid->addTag+=cur->addTag;
cur->rightKid->addTag+=cur->addTag;
}void upshUpChange(node *cur){
if(cur->tag==-1)return ;
cur->leftKid->val=cur->tag;
cur->rightKid->val=cur->tag;
cur->leftKid->tag=cur->tag;
cur->rightKid->tag=cur->tag;
cur->leftKid->addTag=0;
cur->rightKid->addTag=0;
}
void pushUp(node *cur){
if(cur->addTag==cur->tag&&cur->tag==-1)return ;
upshUpChange(cur);
pushUpAdd(cur);
}
void add(node *cur,ll l,ll r,ll x){
if(cur->r<l||cur->l>r)return ;
if(cur->r<=r&&cur->l>=l){
cur->addTag+=x;
cur->val+=x;
return ;
}ll mid=(cur->l+cur->r)>>1;
pushUp(cur);
if(mid>=l)add(cur->leftKid,l,r,x);
if(mid<r)add(cur->rightKid,l,r,x);
cur->val=max(cur->leftKid->val,cur->rightKid->val);
}void change(node *cur,ll l,ll r,ll x){
if(cur->r<l||cur->l>r)return ;
if(cur->r<=r&&cur->l>=l){
cur->addTag=0;
cur->tag=x;
cur->val=x;
return ;
}ll mid=(cur->l+cur->r)>>1;
pushUp(cur);
if(mid>=l)change(cur->leftKid,l,r,x);
if(mid<r)change(cur->rightKid,l,r,x);
cur->val=max(cur->leftKid->val,cur->rightKid->val);
// cout<<cur->l<<' '<<cur->r<<' '<<cur->val<<endl;
}ll query(node *cur,ll l,ll r){
//cout<<l<<' '<<r<<' '<<cur->val<<' '<<cur->l<<' '<<cur->r<<endl;
if(cur->r<l||cur->l>r)return 0;
if(cur->r<=r&&cur->l>=l){
return cur->val;
}pushUp(cur);
ll res=0;
ll mid=(l+r)>>1;
if(mid>=l)res=max(res,query(cur->leftKid,l,r));
if(mid<r)res=max(res,query(cur->rightKid,l,r));
return res;
}
}tr;
ll l,r;
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}//tr.root=tr.build(1,n);
tr.build(tr.root,1,n);
// cout<<1;
// cout<<tr.root->val;
while(q--){
cin>>opt>>l>>r;
switch(opt){
case 1:
cin>>x;
tr.change(tr.root,l,r,x);
break;
case 2:
cin>>x;
tr.add(tr.root,l,r,x);
break;
case 3:
cout<<tr.query(tr.root,l,r)<<endl;
}
}
return 0;
}//-fsanitize=address
回复
共 3 条回复,欢迎继续交流。
正在加载回复...