zoukankan      html  css  js  c++  java
  • POJ 2887 Big String 线段树 离线处理

    一开始看的时候没什么思路,后来一看卧槽不是简单的离线处理么。反着插入一遍然后直接查询就好了。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    #define lson rt << 1, l, mid
    #define rson rt << 1 | 1, mid + 1, r
    
    const int maxq = 2e3 + 10;
    const int maxn = 1e6 + 10 + maxq;
    
    int sum[maxn << 2];
    
    void build(int rt,int l,int r) {
        if(l == r) sum[rt] = 1;
        else {
            int mid = (l + r) >> 1;
            build(lson); build(rson);
            sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
        }
    }
    
    void update(int rt,int l,int r,int pos,int tar) {
        if(l == r) sum[rt] = tar;
        else {
            int mid = (l + r) >> 1;
            if(pos <= mid) update(lson,pos,tar);
            else update(rson,pos,tar);
            sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
        }
    }
    
    int query(int rt,int l,int r,int val) {
        if(l == r) return l;
        int mid = (l + r) >> 1;
        if(sum[rt << 1] >= val) return query(lson,val);
        else return query(rson,val - sum[rt << 1]);
    }
    
    char str[maxn],str1[maxn],cmd[maxq],val[maxq];
    int q,n,len,pos[maxq],rpos[maxn],icnt[maxq];
    
    
    int main() {
        scanf("%s",str);
        len = strlen(str);
        scanf("%d",&q);
        icnt[0] = len;
        for(int i = 1;i <= q;i++) {
            scanf(" %c",&cmd[i]);
            if(cmd[i] == 'I') {
                scanf(" %c%d",&val[i],&pos[i]);
                icnt[i] = icnt[i - 1] + 1;
            }
            else {
                scanf("%d",&pos[i]);
                icnt[i] = icnt[i - 1];
            }
        }
    
        n = icnt[q];
    
        build(1,1,n);
    
        for(int i = q;i >= 1;i--) if(cmd[i] == 'I') {
            pos[i] = min(pos[i],icnt[i]);
            rpos[i] = query(1,1,n,pos[i]);
            update(1,1,n,rpos[i],0);
            str1[rpos[i]] = val[i];
        }
    
        for(int i = 1, zcnt = 0;i <= n;i++) {
            if(str1[i] == 0) {
                str1[i] = str[zcnt++];
                //update(1,1,n,i,1);
            }
        }
    
        for(int i = 1;i <= q;i++) {
            if(cmd[i] == 'Q') {
                int ret = query(1,1,n,pos[i]);
                printf("%c
    ",str1[ret]);
            }
            else {
                update(1,1,n,rpos[i],1);
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    Golang-字符串常用的系统函数
    35.HTML--网页自动跳转 5种方法
    34.js----JS 开发者必须知道的十个 ES6 新特性
    33. 禁止鼠标右键保存图片、禁止拖动图片
    32.js 判断当前页面是否被浏览
    31.JS实现控制HTML5背景音乐播放暂停
    30.get和post的区别
    29.html5 移动端开发总结
    28.json数组,select选择,input输出对应数据
    27.给input边框和背景颜色设置全透明
  • 原文地址:https://www.cnblogs.com/rolight/p/3956417.html
Copyright © 2011-2022 走看看