zoukankan      html  css  js  c++  java
  • array

    array

    权值线段树

    查询剪枝

    疯狂RE

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define maxn 100000+500
    #define inf n+1
    int L[maxn*4],R[maxn*4],V[maxn*4];
    int A[maxn],B[maxn];
    inline int read()
    {
        char ch=getchar();
        int ans=0;
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch>='0'&&ch<='9')
        {
            ans=ans*10+ch-'0';
            ch=getchar();
        }
        return ans;
    }
    
    int n,m,La;
    void build(int l,int r,int x)
    {
        L[x]=l,R[x]=r;
        if(l==r)
        {
            V[x]=A[l];
            return;
        }
        int mid=(l+r)/2;
        build(l,mid,2*x);
        build(mid+1,r,2*x+1);
        V[x]=max(V[2*x],V[2*x+1]);
        return;
    }
    void update(int x,int d,int w)
    {
        if(L[x]==R[x]&&L[x]==d)
        {
            V[x]=w;
            return;
        }else if(L[x]==R[x])return;
        int mid=(L[x]+R[x])/2;
        if(d<=mid)update(2*x,d,w);
        else update(2*x+1,d,w);
        V[x]=max(V[2*x],V[2*x+1]);
    }
    
    bool query(int x,int b,int c)
    {
      //cout<<x<<' '<<b<<' '<<c<<endl;
    
        if(L[x]==R[x]&&V[x]>b&&c<=L[x])
        {
            cout<<L[x]<<'
    ';
            La=L[x];
            return true;
        }
        else if(L[x]==R[x])return false;
        int mid=(L[x]+R[x])/2;
        if(c<=mid&&V[2*x]>b)
            if(query(2*x,b,c))return true;
        if(c<=R[x]&&V[2*x+1]>b)
            if(query(2*x+1,b,c))return true;
        return false;
    
    }
    signed main()
    {
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        int T,a,b,c;
        T=read();
        while(T--)
        {
            // init();
            n=read(),m=read();
            for(int i=1; i<=n; i++)
            {
                a=read();
                A[a]=i;
                B[i]=a;
            }
            //A[n+1]=n+1;
            build(1,n,1);
            La=0;
            for(int i=1; i<=m; i++)
            {
                a=read();
                if(a==1)
                {
                    b=read();
                    b^=La;
                    update(1,B[b],n+1);
                }
                else
                {
                    b=read();
                    c=read();
                    //cout<<La<<"LE
    ";
                    b^=La;
                    c^=La;
                    if(!query(1,b,c))
                    {
                        cout<<n+1<<'
    ';
                        La=(n+1);
                    }
                }
            }
        }
    
    
    
    }

    为什么写这种就能过?

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define maxn 100000+500
    #define inf n+1
    int L[maxn*4],R[maxn*4],V[maxn*4];
    int A[maxn],B[maxn];
    inline int read()
    {
        char ch=getchar();
        int ans=0;
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch>='0'&&ch<='9')
        {
            ans=ans*10+ch-'0';
            ch=getchar();
        }
        return ans;
    }
    
    int n,m,La;
    void build(int l,int r,int x)
    {
    
        if(l==r)
        {
            V[x]=A[l];
            return;
        }
        int mid=(l+r)/2;
        build(l,mid,2*x);
        build(mid+1,r,2*x+1);
        V[x]=max(V[2*x],V[2*x+1]);
        return;
    }
    void update(int x,int l,int r,int d,int w)
    {
        if(l==r)
        {
            V[x]=w;
            return;
        }
        int mid=(l+r)/2;
        if(d<=mid)update(2*x,l,mid,d,w);
        else update(2*x+1,mid+1,r,d,w);
        V[x]=max(V[2*x],V[2*x+1]);
    }
    
    bool query(int x,int l,int r,int b,int c)
    {
      //cout<<x<<' '<<b<<' '<<c<<endl;
    
        if(l==r&&V[x]>b&&c<=l)
        {
            cout<<l<<'
    ';
            La=l;
            return true;
        }
        else if(l==r)return false;
        int mid=(l+r)/2;
        if(c<=mid&&V[2*x]>b)
            if(query(2*x,l,mid,b,c))return true;
        if(c<=r&&V[2*x+1]>b)
            if(query(2*x+1,mid+1,r,b,c))return true;
        return false;
    
    }
    signed main()
    {
        freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        int T,a,b,c;
        T=read();
        while(T--)
        {
            // init();
            n=read(),m=read();
            for(int i=1; i<=n; i++)
            {
                a=read();
                A[a]=i;
                B[i]=a;
            }
            //A[n+1]=n+1;
            build(1,n,1);
            La=0;
            for(int i=1; i<=m; i++)
            {
                a=read();
                if(a==1)
                {
                    b=read();
                    b^=La;
                    update(1,1,n,B[b],n+1);
                }
                else
                {
                    b=read();
                    c=read();
                    //cout<<La<<"LE
    ";
                    b^=La;
                    c^=La;
                    if(!query(1,1,n,b,c))
                    {
                        cout<<n+1<<'
    ';
                        La=(n+1);
                    }
                }
            }
        }
    
    
    
    }
  • 相关阅读:
    java se 转到ee小结
    objective c基本知识
    2013_11_14:递归算法(2)—全排列
    2013_11_13:递归算法(1)
    2013_11_13:关于 new 和delelte 的使用
    c++调试问题
    模式匹配BM算法介绍与实现
    一个n数组求和问题
    机试题
    算法题目
  • 原文地址:https://www.cnblogs.com/liulex/p/11404036.html
Copyright © 2011-2022 走看看