• bzoj1901(Zju2112 Dynamic Rankings)


    题目链接:没有权限,进不去,题目也没法交,代码也不知道对不对,有好心人有权限帮忙交下吧QAQ

    题目大意:带区间修改的第K小数

    题目思路:有树套树,块状链表等优秀数据结构可以解决该题,当然我还是继续练习整体二分。

         把修改操作拆开成两个操作 1.删除节点上的数 2.加入一个新数,然后更新的时候注意删除操作对树状数组的更新与插入操作相反,其他的没有难度

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <cstring>
    #include <stack>
    #include <cctype>
    #include <queue>
    #include <string>
    #include <vector>
    #include <set>
    #include <map>
    #include <climits>
    #define lson root<<1,l,mid
    #define rson root<<1|1,mid+1,r
    #define fi first
    #define se second
    #define ping(x,y) ((x-y)*(x-y))
    #define mst(x,y) memset(x,y,sizeof(x))
    #define mcp(x,y) memcpy(x,y,sizeof(y))
    using namespace std;
    #define gamma 0.5772156649015328606065120
    #define MOD 1000000007
    #define inf 0x3f3f3f3f
    #define N 26005
    #define maxn 5005
    typedef pair<int,int> PII;
    typedef long long LL;
    
    int n,m;char str[5];
    struct Node{
        int id,l,r,v,f;
        Node(){}
        Node(int a,int b,int c,int d,int e){
            id=a;l=b;r=c;v=d;f=e;
        }
    }node[N],t1[N],t2[N];int hcnt;
    int tree[N],has[N],ans[N];  ///has数组标记删除节点是应该删除第几个加入操作
    void add(int i,int v){
        for(;i<=n;i+=(i&-i))
            tree[i]+=v;
    }
    int query(int i){
        int res=0;
        for(;i;i-=(i&-i))res+=tree[i];
        return res;
    }
    void solve(int ql,int qr,int l,int r){
        if(ql>qr)return;
        if(l==r){
            for(int i=ql;i<=qr;++i)
                if(node[i].f==2)ans[node[i].id]=l;
            return;
        }
        int mid=l+r>>1;
        int len1=0,len2=0;
        for(int i=ql;i<=qr;++i){
            if(node[i].f==1){  ///插入操作
                if(node[i].v<=mid){
                    add(node[i].id,1);
                    t1[len1++]=node[i];
                }
                else t2[len2++]=node[i];
            }
            else if(node[i].f==2){  ///询问操作
                int temp=query(node[i].r)-query(node[i].l-1);
                if(node[i].v<=temp){
                    t1[len1++]=node[i];
                }
                else{
                    node[i].v-=temp;
                    t2[len2++]=node[i];
                }
            }
            else{  ///删除操作,消除节点修改前对结果的影响
                if(node[i].v<=mid){ ///更新过就删除
                    t1[len1++]=node[i];
                    add(node[i].id,-1);
                }
                else{               ///否则不用删除
                    t2[len2++]=node[i];
                }
            }
        }
        for(int i=0;i<len1;++i)if(t1[i].f==1||t1[i].f==3){add(t1[i].id,(t1[i].f==3?1:-1));}
        for(int i=0;i<len1;++i)node[i+ql]=t1[i];
        for(int i=0;i<len2;++i)node[i+ql+len1]=t2[i];
        solve(ql,ql+len1-1,l,mid);
        solve(ql+len1,qr,mid+1,r);
    }
    int main(){
        int i,j,group,x,y,v;
        int _min,_max;
        while(scanf("%d%d",&n,&m)!=EOF){
            _min=inf;_max=-inf;
            hcnt=0;mst(tree,0);
            for(i=1;i<=n;++i){
                scanf("%d",&x);
                _min=min(_min,x);
                _max=max(_max,x);
                has[i]=i;
                node[++hcnt]=Node(i,1,1,x,1);
            }
            for(i=1;i<=m;++i){
                scanf("%s",str);
                if(str[0]=='Q'){
                    scanf("%d%d%d",&x,&y,&v);
                    node[++hcnt]=Node(i,x,y,v,2);
                }
                else{
                    scanf("%d%d",&x,&y);
                    _min=min(_min,y);
                    _max=max(_max,y);
                    node[++hcnt]=node[has[x]];
                    node[hcnt].f=3;
                    node[++hcnt]=Node(i,1,1,y,1);
                    has[x]=hcnt;
                }
            }
            solve(1,hcnt,_min,_max);
            for(i=1;i<=hcnt;++i)
                if(node[i].f==2)
                    {printf("%d
    ",ans[node[i].id]);}
        }
        return 0;
    }
  • 相关阅读:
    使用 yo 命令行向导给 SAP UI5 应用添加一个新的视图
    SAP Fiori Elements 应用的 manifest.json 文件运行时如何被解析的
    SAP UI5 标准应用的多语言支持
    微软 Excel 365 里如何设置下拉菜单和自动高亮成指定颜色
    SAP Fiori Elements 应用里的 Title 显示的内容是从哪里来的
    本地开发好的 SAP Fiori Elements 应用,如何部署到 ABAP 服务器上?
    如何在 Cypress 测试代码中屏蔽(Suppress)来自应用代码报出的错误消息
    教你一招:让集群慢节点无处可藏
    应用架构步入“无服务器”时代 Serverless技术迎来新发展
    MySQL数据库事务隔离性的实现
  • 原文地址:https://www.cnblogs.com/Kurokey/p/5625330.html
Copyright © 2020-2023  润新知