2021 Niu Guest Winter Holiday Algorithm Basic Training Camp 3 E-Buy Gifts

Topic link
topic
Insert picture description here

Solution: The
person who wrote the question wrote the solution quite well, so you can use it.
Insert picture description here

Code:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int>pii;
const int MAXN=5e5+5;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const double pi=acos(-1);
struct Node
{
    
    
    int l,r;
    int minn;   
}node[MAXN<<2];
int nex[MAXN];
int last[MAXN];
int a[MAXN];
int vis[1000005];
void push_up(int num)
{
    
    
    node[num].minn=min(node[num<<1].minn,node[num<<1|1].minn);
}
void build(int l,int r,int num)
{
    
    
    node[num].l=l;
    node[num].r=r;
    if(l==r)
    {
    
    
        node[num].minn=nex[l];
        //cout<<l<<" "<<nex[l]<<endl;
        return;
    }
    int mid=(l+r)/2;
    build(l,mid,num<<1);
    build(mid+1,r,num<<1|1);
    push_up(num);
}
int query(int l,int r,int num)
{
    
    
    if(node[num].l>=l&&node[num].r<=r)
    {
    
    
        return node[num].minn;
    }
    int ans=1e9;
    int mid=(node[num].l+node[num].r)>>1;
    if(l<=mid)
    {
    
    
        ans=min(ans,query(l,r,num<<1));
    }
    if(r>mid)
    {
    
    
        ans=min(ans,query(l,r,num<<1|1));
    }
    return ans;
}
void updata(int pos,int x,int num)
{
    
    
    if(node[num].l==node[num].r)
    {
    
    
        node[num].minn=x;
        return;
    }
    int mid=(node[num].l+node[num].r)>>1;
    if(pos<=mid)
    {
    
    
        updata(pos,x,num<<1);
    }
    else
    {
    
    
        updata(pos,x,num<<1|1);
    }
    push_up(num);
}
int main()
{
    
    
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
    
    
        cin>>a[i];
        if(!vis[a[i]])
        {
    
    
            last[i]=0;
            vis[a[i]]=i;
        }
        else
        {
    
    
            last[i]=vis[a[i]];
            nex[vis[a[i]]]=i;
            vis[a[i]]=i;
        }
    }
    for(int i=1;i<=n;i++)
    {
    
    
        if(!nex[i])
        {
    
    
            nex[i]=n+1;
        }
    }
    build(1,n,1);
    //cout<<query(1,1,1)<<endl;
    //cout<<endl;
    // for(int i=1;i<=n;i++)
    // {
    
    
    //     cout<<i<<" "<<last[i]<<" "<<nex[i]<<" "<<query(i,i,1)<<endl;
    // }
    //cout<<endl;
    int op,x,l,r;
    while(q--)
    {
    
    
        cin>>op;
        if(op==1)
        {
    
       
            cin>>x;
            nex[last[x]]=nex[x];
            updata(last[x],nex[x],1);
            last[nex[x]]=last[x];
            last[x]=0;nex[x]=n+1;
            updata(x,n+1,1);
            //cout<<query(2,2,1)<<endl;
            // cout<<endl;
            // for(int i=1;i<=n;i++)
            // {
    
    
            //     cout<<i<<" "<<last[i]<<" "<<nex[i]<<endl;
            // }
            // cout<<endl;
        }
        else
        {
    
    
            cin>>l>>r;
            int ans=query(l,r,1);
            //cout<<ans<<" "<<"wd"<<endl;
            if(ans<=r) printf("1\n");
            else printf("0\n");
        }
    }
}

Guess you like

Origin blog.csdn.net/weixin_45755679/article/details/113723015