好题 线段树对数据的保存+离线的逆向插入 POJ 2887
题目大意:给一个字符串,有插入和询问操作,每次往一个位置插入一个字符或者询问第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的更多相关文章
- 「CQOI2006」简单题 线段树
「CQOI2006」简单题 线段树 水.区间修改,单点查询.用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...
- hihoCoder #1079 : 离散化 (线段树,数据离散化)
题意:有一块宣传栏,高一定,给出长度,再给出多张海报的张贴位置,问还能见到几张海报(哪怕有一点被看到)?假设海报的高于宣传栏同高. 思路:问题转成“给出x轴上长为L的一条线段,再用n条线段进行覆盖上去 ...
- 洛谷P5057 [CQOI2006]简单题(线段树)
题意 题目链接 Sol 紫色的线段树板子题??... #include<iostream> #include<cstdio> #include<cmath> usi ...
- New Year Tree 【DFS序+线段树区间查询修改+二进制保存状态】
题目链接[http://codeforces.com/problemset/problem/620/E] 题意:给出n个数,每个数有一个初始的颜色.由这n个数组成一颗树.有两种操作1.将以节点u为根的 ...
- HDU - 6521 Party (SYSU校赛K题)(线段树)
题目链接 题意:n个人排成一列,一开始他们互不认识,每次选[l,r]上的人开party,使他们互相认识,求出每次party之后新互相认识的人的对数. 思路:把“互相认识”变成单向连边,只考虑左边的人对 ...
- C#LeetCode刷题-线段树
线段树篇 # 题名 刷题 通过率 难度 218 天际线问题 32.7% 困难 307 区域和检索 - 数组可修改 42.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 4 ...
- UVAlive7141 BombX 14年上海区域赛D题 线段树+离散化
题意:一个无限大的棋盘, 有n个小兵, 给出了n个兵的坐标, 现在有一个长为width 高为height的炸弹放在棋盘上, 炸弹只能上下左右平移, 不能旋转. 且放炸弹的区域不能含有士兵, 炸弹可以一 ...
- Codeforces 438D (今日gg模拟第二题) | 线段树 考察时间复杂度的计算 -_-|||
Codeforces 438D The Child and Sequence 给出一个序列,进行如下三种操作: 区间求和 区间每个数模x 单点修改 如果没有第二个操作的话,就是一棵简单的线段树.那么如 ...
- hdu 5475 模拟计算器乘除 (2015上海网赛H题 线段树)
给出有多少次操作 和MOD 初始值为1 操作1 y 表示乘上y操作2 y 表示除以第 y次操作乘的那个数 线段树的叶子结点i 表示 第i次操作乘的数 将1替换成y遇到操作2 就把第i个结点的值 替换成 ...
随机推荐
- SQLAlchemy入门
什么是SQLAlchemy? 是Python连接SQL数据库的一种方式,需要通过驱动来连接. 是Python中使用最广泛的ORM(对象关系映射)工具之一,即把数据库中的二维表结构映射成一个list对象 ...
- JAVA 并发编程关键点
上下文切换 死锁 volatile synchronized 原子操作 happens-before as-if serial 锁的内存 final 线程:daemon start suspend r ...
- LOOPS
LOOPS 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3853 递推 设dp[i][j]为(i,j)到终点期望的使用魔力值,mp[i][ ...
- stl实现结构体排序关键语法要点(sort)
sort函数,调用时使用函数头: #include <algorithm> sort(begin,end);用来表示一个范围. int _tmain(int argc, _TCHAR* a ...
- Spring入门学习(一)
Spring的主要功能是控制反转和面向切面编程,下面我们就来编写第一个spring的程序来体验一下控制反转 首先是加载配置文件 <?xml version="1.0" enc ...
- delphi中ShellExecute使用详解
http://jingyan.baidu.com/article/ae97a646ae00a2bbfd461d38.html 百度的讲解 http://www.cnblogs.com/del/arch ...
- JavaScript绘制表格并将内容以JSON返回后台
只是随手记一下 function printTable() { var aText = []; aText.push("<tr"); aText.push("< ...
- 【Loadrunner】初学Loadrunner——IP欺骗
因为在默认情况下,同一个用户用同一个IP访问运行是不符合实际情况的,而且很多网站会自动屏蔽同个IP多次重复访问.那么就想到了Loadrunner的虚拟IP技术,也就是常说的IP欺骗.在用Loadrun ...
- PHP ServerPush (推送) 技术
用来代替ajax的请求 转自:http://blog.163.com/bailin_li/blog/static/17449017920124811524364/ 需求: 我想做个会员站内通知的功能. ...
- ajax的项目实操(只用于记录部分文件未引入)
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...