社区讨论

求条,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 条回复,欢迎继续交流。

正在加载回复...