zoukankan      html  css  js  c++  java
  • ccpc网赛 hdu6703 array(权值线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=6703

    大意:给一个n个元素的数组,其中所有元素都是不重复的[1,n]。

    两种操作:

    将pos位置元素+1e7

    查询不属于[1,r]中的最小的>=k的值

    思路:将数组元素排序,根据其下标建立权值线段树,维护下标的最大值。

    修改将对应值在线段树中的下标直接改为inf32。

    查询时,查[k,n+1]区间内找到第一个下标>r的位置。

    #include<bits/stdc++.h>
    #define ll long long
    #define PII pair<int,int>
    #define PLL pair<ll,ll>
    #define clean(a,b) memset(a,b,sizeof(a))
    using namespace std;
    const int MAXN=1e5+10;
    const int INF32=0x3f3f3f3f;
    const ll INF64=0x3f3f3f3f3f3f3f3f;
    const ll MOD=1e9+7;
    const double PI=acos(-1.0);
    const double EPS=1.0e-8;
    
    struct segTree{
        struct node{
            int l,r,len,id,mx;
        }tree[MAXN<<2];
        void pushup(int rt){
            tree[rt].mx = max(tree[rt<<1].mx,tree[rt<<1|1].mx);
        }
        void build(int l,int r,int rt,int A[]){
            tree[rt].l=l;tree[rt].r=r;tree[rt].len=r-l+1;
            if(l==r){
                tree[rt].id = tree[rt].mx = A[l];
                return;
            }
            int mid = (l+r)>>1;
            build(l,mid,rt<<1,A);
            build(mid+1,r,rt<<1|1,A);
            pushup(rt);
        }
        void update(int pos,int val,int rt){
            if(tree[rt].l==tree[rt].r){
                tree[rt].id = tree[rt].mx = val;
                return;
            }
            if(pos<=tree[rt<<1].r) update(pos,val,rt<<1);
            else update(pos,val,rt<<1|1);
            pushup(rt);
        }
        int query(int ql,int qr,int val,int rt){
            if(tree[rt].l==tree[rt].r) return tree[rt].l;
            int ans = INF32;
            if(ql<=tree[rt<<1].r&&val<tree[rt<<1].mx) ans=query(ql,qr,val,rt<<1);
            if(ans!=INF32) return ans;
            if(qr>=tree[rt<<1|1].l&&val<tree[rt<<1|1].mx) ans=query(ql,qr,val,rt<<1|1);
            return ans;
        }
    };
    segTree seg;
    PII A[MAXN];
    int B[MAXN];
    int n,m;
    
    int cmp1(PII a,PII b){
        return a.second<b.second;
    }
    
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        int t;
        cin>>t;
        while(t--){
            cin>>n>>m;
            for(int i=1;i<=n;i++){
                cin>>A[i].first;
                A[i].second = i;
            }
            sort(A+1,A+1+n);
            for(int i=1;i<=n;i++){
                B[i] = A[i].second;
            }
            sort(A+1,A+1+n,cmp1);
            B[++n] = INF32;
            seg.build(1,n,1,B);
            int ans = 0;
            while(m--){
                int opt;
                cin>>opt;
                if(opt==1){
                    int t1,pos;
                    cin>>t1;
                    pos = t1^ans;
                    seg.update(A[pos].first,INF32,1);
                }
                else {
                    int t2,t3,r,k;
                    cin>>t2>>t3;
                    r = t2^ans; 
                    k = t3^ans;
                    cout<<(ans=seg.query(k,n,r,1))<<endl;
                }
            }
        }
        return 0;
    }
    
  • 相关阅读:
    ASP.NET MVC 5 入门(10):添加验证
    ASP.NET MVC 5 入门(09):添加新字段
    MVC5与EF6结合教程(06):创建更复杂的数据模型
    MVC5与EF6结合教程(05):Code First 迁移和部署
    ASP.NET MVC 5 入门(08):添加搜索方法和搜索视图
    ASP.NET MVC 5 入门(07):检查 Edit 方法和编辑视图
    微信小程序入门1:准备
    MVC5与EF6结合教程(04):连接复原和命令截获
    ASP.NET MVC 5 入门(06):控制器访问模型的数据
    ASP.NET MVC 5 入门(05):创建连接字符串并使用 SQL Server LocalDB
  • 原文地址:https://www.cnblogs.com/wzgg/p/11411580.html
Copyright © 2011-2022 走看看