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;
    }
    

      

  • 相关阅读:
    【天梯 L2-008 最长对称子串 】 最长回文子串 manacher
    【天梯L2-001 城市间紧急救援】 双关键字最短路+记录路径 堆优化Dijkstra
    记录板

    留言板
    使用 Docker 搭建 Java Web 运行环境(转)
    数据库隔离级别和锁
    线程上下文类加载
    tomcat是怎么找到项目lib目录下的jar包的,求大神解答
    Java中try、finally语句中有return时的执行情况 [转]
  • 原文地址:https://www.cnblogs.com/rolight/p/3956417.html
Copyright © 2011-2022 走看看