ABC G 求调
  • 板块学术版
  • 楼主_Ad_Astra_
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/2/24 22:06
  • 上次更新2024/2/25 10:58:41
查看原帖
ABC G 求调
317622
_Ad_Astra_楼主2024/2/24 22:06

逻辑写的有点混乱。

int n,q,a[200010],l[200010],r[200010],x[200010];
struct tnode
{
    int l,r;
    multiset<int>tag;
    tnode(){}
    tnode(int _l,int _r,multiset<int> _tag)
    {
        l=_l,r=_r,tag=_tag;
    }
};
struct segtree
{
    tnode t[800010];
    void pushup(int rt)
    {
        ;
    }
    void pushdown(int rt)
    {
//        if(!t[rt].tag.size())return;
//        int x=*t[rt].tag.rbegin(); 
//        t[ls].tag.insert(x);
//        t[rs].tag.insert(x);
//        t[rt].tag.erase(t[rt].tag.end());
    }
    void build(int rt,int l,int r)
    {
        t[rt].l=l,t[rt].r=r;
        if(l==r)
        {
            return;
        }
        int mid=l+r>>1;
        build(ls,l,mid);
        build(rs,mid+1,r);
        pushup(rt);
    }
    void update(int rt,int l,int r,int x)
    {
        if(t[rt].l==l&&t[rt].r==r)
        {
            t[rt].tag.insert(x);
            return;
        }
        pushdown(rt);
        if(r<=t[ls].r)update(ls,l,r,x);
        else if(l>=t[rs].l)update(rs,l,r,x);
        else update(ls,l,t[ls].r,x),update(rs,t[rs].l,r,x);
        pushup(rt);
        return;
    }
    void undo(int rt,int l,int r,int x)
    {
        if(t[rt].l==l&&t[rt].r==r)
        {
            t[rt].tag.erase(t[rt].tag.find(x));
            return;
        }
        pushdown(rt);
        if(r<=t[ls].r)undo(ls,l,r,x);
        else if(l>=t[rs].l)undo(rs,l,r,x);
        else undo(ls,l,t[ls].r,x),undo(rs,t[rs].l,r,x);
        pushup(rt);
        return;
    }
    int query(int rt,int id)
    {
        if(t[rt].l==id&&t[rt].r==id)
        {
            return (t[rt].tag.size()?(*t[rt].tag.begin()):0);
        }
        pushdown(rt);
        int ans=0;
        if(id<=t[ls].r)ans=query(ls,id);
        else if(id>=t[rs].l)ans=query(rs,id);
        chmax(ans,(t[rt].tag.size()?(*t[rt].tag.begin()):0));
        return ans;
    }
}sgt;
void main_solve(int test_id)
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	sgt.build(1,1,n);
	cin>>q;
	for(int i=1;i<=q;i++)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			cin>>l[i]>>r[i]>>x[i];
			sgt.update(1,l[i],r[i],x[i]);
		}
		else if(op==2)
		{
			int id;
			cin>>id;
			sgt.undo(1,l[id],r[id],x[id]);
		}
		else
		{
			int id;
			cin>>id;
			int l=sgt.query(1,id);
			cout<<max(a[id],l)<<endl;
		}
	}
	return;
}
2024/2/24 22:06
加载中...