题目大意:给一个字符串,有插入和询问操作,每次往一个位置插入一个字符或者询问第p个位置的字符是什么。

思路:我们离线询问,逆向把所有的字符都插入给线段树,然后再查询就好了,每次都要记得插入线段树的最后的位置,然后要把这个位置给保存下来在O(1)查询即可。

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
const int maxq = + ;
const int maxch = + ;
int tree[maxch << ]; inline void pushup(int o){
tree[o] = tree[o << ] + tree[o << | ];
} void buildtree(int o, int l, int r){
if (l == r){
tree[o] = ;
return ;
}
int mid = (l + r) / ;
if (l <= mid) buildtree(o << , l ,mid);
if (r > mid) buildtree(o << | , mid + , r);
pushup(o);
} void update(int o, int l, int r, int pos, int val){
if (l == r && l == pos){
tree[o] = val;
return ;
}
int mid = (l + r) / ;
if (pos <= mid) update(o << , l, mid, pos, val);
if (pos > mid) update(o << | , mid + , r, pos, val);
pushup(o);
} int query(int o, int l, int r, int pos){
if (l == r) return l;
int mid = (l + r) / ;
if (tree[o << ] >= pos) return query(o << , l, mid, pos);
if (tree[o << ] < pos) return query(o << | , mid + , r, pos - tree[o << ]);
}
///要知道的东西:询问,初始的ch,线段树节点上的val,线段树该节点下还有多少子节点
struct Query{
int ty, pos, cnt;///表示目前有几个插入的
char val;
Query(int ty = , char val = , int pos = , int cnt = ): ty(ty), val(val), pos(pos), cnt(cnt){}
}q[maxch];
int tpos[maxch], Q;
char tval[maxch], ch[maxch]; int main(){
scanf("%s", ch);
int len = strlen(ch);
scanf("%d", &Q);
int cnt = len;
for (int i = ; i <= Q; i++){
char c[]; scanf("%s", c);
if (c[] == 'I') {
char cc[]; scanf("%s", cc);
int pos; scanf("%d", &pos);
q[i] = Query(c[], cc[], pos, cnt + );///目前该询问下的种类,val和位置,加上已经有了多少个字母了
cnt++;
}
else {
int pos; scanf("%d", &pos);
q[i] = Query(c[], , pos, cnt);
}
}
/*①逆序放入②得到逆序放入以后放入位置的val是多少*/
int n = cnt;
///printf("n = %d\n", n);
buildtree(, , n); for (int i = Q; i >= ; i--){///知道他是在哪个位置的
if (q[i].ty == 'I'){
q[i].pos = min(q[i].pos, q[i].cnt);
int p = query(, , n, q[i].pos); ///线段树里面的位置
tpos[i] = p;
tval[p] = q[i].val;///线段树该位置下的val
update(, , n, p, );
}
}
for (int i = , j = ; i <= n; i++){
if (tval[i] == ){
tval[i] = ch[j]; j++;
}
}
for (int i = ; i <= Q; i++){
if (q[i].ty == 'I'){
update(, , n, tpos[i], );
}
else {
int p = query(, , n, q[i].pos);
printf("%c\n", tval[p]);
}
}
return ;
}

好题 线段树对数据的保存+离线的逆向插入 POJ 2887的更多相关文章

  1. 「CQOI2006」简单题 线段树

    「CQOI2006」简单题 线段树 水.区间修改,单点查询.用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...

  2. hihoCoder #1079 : 离散化 (线段树,数据离散化)

    题意:有一块宣传栏,高一定,给出长度,再给出多张海报的张贴位置,问还能见到几张海报(哪怕有一点被看到)?假设海报的高于宣传栏同高. 思路:问题转成“给出x轴上长为L的一条线段,再用n条线段进行覆盖上去 ...

  3. 洛谷P5057 [CQOI2006]简单题(线段树)

    题意 题目链接 Sol 紫色的线段树板子题??... #include<iostream> #include<cstdio> #include<cmath> usi ...

  4. New Year Tree 【DFS序+线段树区间查询修改+二进制保存状态】

    题目链接[http://codeforces.com/problemset/problem/620/E] 题意:给出n个数,每个数有一个初始的颜色.由这n个数组成一颗树.有两种操作1.将以节点u为根的 ...

  5. HDU - 6521 Party (SYSU校赛K题)(线段树)

    题目链接 题意:n个人排成一列,一开始他们互不认识,每次选[l,r]上的人开party,使他们互相认识,求出每次party之后新互相认识的人的对数. 思路:把“互相认识”变成单向连边,只考虑左边的人对 ...

  6. C#LeetCode刷题-线段树

    线段树篇 # 题名 刷题 通过率 难度 218 天际线问题   32.7% 困难 307 区域和检索 - 数组可修改   42.3% 中等 315 计算右侧小于当前元素的个数   31.9% 困难 4 ...

  7. UVAlive7141 BombX 14年上海区域赛D题 线段树+离散化

    题意:一个无限大的棋盘, 有n个小兵, 给出了n个兵的坐标, 现在有一个长为width 高为height的炸弹放在棋盘上, 炸弹只能上下左右平移, 不能旋转. 且放炸弹的区域不能含有士兵, 炸弹可以一 ...

  8. Codeforces 438D (今日gg模拟第二题) | 线段树 考察时间复杂度的计算 -_-|||

    Codeforces 438D The Child and Sequence 给出一个序列,进行如下三种操作: 区间求和 区间每个数模x 单点修改 如果没有第二个操作的话,就是一棵简单的线段树.那么如 ...

  9. hdu 5475 模拟计算器乘除 (2015上海网赛H题 线段树)

    给出有多少次操作 和MOD 初始值为1 操作1 y 表示乘上y操作2 y 表示除以第 y次操作乘的那个数 线段树的叶子结点i 表示 第i次操作乘的数 将1替换成y遇到操作2 就把第i个结点的值 替换成 ...

随机推荐

  1. 超链接解决头部fixed问题

    ///////////超链接解决头部fixed问题 $('a[href*=#]').click(function () { var top1 = $(".header").heig ...

  2. PIE使用阴影后的背景透明方法

    使用PIE后,会发现如果有设置 box-shadow 时,当前 class 样式中设置 opacity 或者背景渐变透明都会无效了,其实也是有办法解决的 css3-container { filter ...

  3. background-clip、background-origin、box-sizing

    background-clip:border-box(默认).padding-box.content-box background-origin:border-box.padding-box(默认). ...

  4. ggplot2 坐标系相关设置(coord)

    在ggplot中,未来更好的数据可视化效果,我们有时候可能要用到一些坐标转换的操作,比如要画横向条形图或者蜘蛛图等. coord_cartesian(xlim = NULL, ylim = NULL) ...

  5. hdu_5925_Coconuts(离散化+dfs)

    题目链接:hdu_5925_Coconuts 题意: 给你一张很大的图,和小于200个的障碍点,问这张图中的联通块有多少个 题解: 由于障碍点只有200个,所以肯定有很多的空白部分,我们将这些空白部分 ...

  6. ARC下面的对象被释放的bug

    一般在ARC管理的方式之下,很难出现对象被过度释放的问题,下面是我将遇到的一个crash. * thread #: tid = , queue = , address=0x18) frame #: f ...

  7. LeetCode OJ 64. Minimum Path Sum

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  8. 基于多线程多用户的FTP服务器与客户端功能实现

    项目介绍: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp server上随意切换目录 允许用户查看当 ...

  9. SDK does not contain any platforms. error (android)

    By default sdk was installed under the C:\Users\<user_name>\AppData\Local\Android\sdk\ directo ...

  10. windows7旗舰版系统自带组件IIS搭建ftp

    1.win7,”开始“,打开”控制面板“,点击”程序“,看到”程序和功能“,如图所示: 2.点击”打开或关闭Windows功能“,如图所示: 3.成功后,打开”控制面板“,点击”系统和安全“,点击”管 ...