zk卡空间求助
查看原帖
zk卡空间求助
521276
张凯_巨大楼主2021/12/8 17:03
#include<iostream>
#include<vector>
#include<cstdio>
#include<map>
using namespace std;
int mx[2000010],mn[2000010],pm[2000010];
int n,m,ds;
map<int,int>id;
struct nod
{
    int l,r,v;
};
vector<nod>s;
int rt[1000010];
vector<int>mm;
void add(int o,int l,int r,int x,int y)
{
    if(l==r)
    {
        s[o].v=y;
        return;
    }
    if(x<=(l+r>>1))
    {
        if(s[o].l==-1)
        {
        	if(mm.empty())
        	{
            	s[o].l=s.size();
            	s.push_back((nod){-1,-1,0});
            }
            else
            {
            	s[o].l=mm[mm.size()-1];
            	s[s[o].l]=(nod){-1,-1,0};
            	mm.pop_back();
            }
        }
        add(s[o].l,l,(l+r>>1),x,y);
    }
    else
    {
        if(s[o].r==-1)
        {
        	if(mm.empty())
        	{
            	s[o].r=s.size();
            	s.push_back((nod){-1,-1,0});
            }
            else
            {
            	s[o].r=mm[mm.size()-1];
            	s[s[o].r]=(nod){-1,-1,0};
            	mm.pop_back();
            }
        }
        add(s[o].r,(l+r>>1)+1,r,x,y);
    }
    s[o].v=0;
    if(s[o].l!=-1)
    {
        s[o].v=max(s[o].v,s[s[o].l].v);
        if(s[s[o].l].v==0)
    	{
    		mm.push_back(s[o].l);
    		s[o].l=-1;
    	}
    }
    if(s[o].r!=-1)
    {
        s[o].v=max(s[o].v,s[s[o].r].v);
        if(s[s[o].r].v==0)
    	{
    		mm.push_back(s[o].r);
    		s[o].r=-1;
    	}
    }

}
int ask(int o,int l,int r,int il,int ir)
{
    if(il<=l&&ir>=r)
    {
        return s[o].v;
    }
    int re=0;
    if(il<=(l+r>>1)&&s[o].l!=-1)
    {
        re=max(re,ask(s[o].l,l,(l+r>>1),il,ir));
    }
    if(ir>(l+r>>1)&&s[o].r!=-1)
    {
        re=max(re,ask(s[o].r,(l+r>>1)+1,r,il,ir));
    }
    return re;
}
void change(int o,int l,int r,int x,int y)
{
    if(l==r)
    {
        if(id[mx[o]])
		{
			add(rt[id[mx[o]]],1,n,x,-x);
		}
        if(!id[y])
        {
            id[y]=++ds;
            rt[ds]=s.size();
            s.push_back((nod){-1,-1,0});
        }
        add(rt[id[y]],1,n,x,x);
        mx[o]=mn[o]=y;
        pm[o]=ask(rt[id[y]],1,n,1,x-1);
        return;
    }
    if(x<=(l+r>>1))
    {
        change(o<<1,l,(l+r>>1),x,y);
    }
    else
    {
        change(o<<1|1,(l+r>>1)+1,r,x,y);
    }
    mx[o]=max(mx[o<<1],mx[o<<1|1]);
    mn[o]=min(mn[o<<1],mn[o<<1|1]);
    pm[o]=max(pm[o<<1],pm[o<<1|1]);
}
int rl,rr,rv;
void query(int o,int l,int r,int il,int ir)
{
    if(il<=l&&ir>=r)
    {
        rl=min(rl,mn[o]);
        rr=max(rr,mx[o]);
        rv=max(rv,pm[o]);
        return ;
    }
    if(il<=(l+r>>1))
    {
        query(o<<1,l,(l+r>>1),il,ir);
    }
    if(ir>(l+r>>1))
    {
        query(o<<1|1,(l+r>>1)+1,r,il,ir);
    }
}
int main()
{
    cin>>n>>m;
    int op,x,y;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        change(1,1,n,i,x);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&op,&x,&y);
        if(op==1)
        {
            change(1,1,n,x,y);
        }
        if(op==2)
        {
            rl=(1<<30);
            rr=-(1<<30);
            rv=0;
            query(1,1,n,x,y);
            if(rr-rl==y-x&&rv<x)
            {
                printf("damushen\n");
                continue;
            }
            printf("yuanxing\n");
        }
    }
    return 0;
}

zk卡空间卡成了63分,宝贝们快来帮帮zk~

2021/12/8 17:03
加载中...