GYM 101064 2016 USP Try-outs G. The Declaration of Independence 主席树
1 second
256 megabytes
standard input
standard output
In 1776, a Committee of Five was chosen to draft the Declaration of Independence of the USA, among them John Adams, Thomas Jefferson and Benjamin Franklin. From June 11 to July 5 they worked tirelessly to write such important document.
It wasn't written correctly in the first attempt, and many many changes had to be made. Since in that time there weren't such great and time-saving utilities like git and version control, they had a very simple but time consuming way to keep old versions of the document.
Suppose Thomas Jefferson wanted to add a line to a version i of the document. Instead of changing the actual document in version i, he would use a letter copying press, a machine just invented by James Watt just around that time, to copy the version i to a new sheet of paper, and then would modify this new sheet of paper. This paper would then be stored so it could be copied later. As each modification creates a new version of the document, the kth modification will create the version k of the document. You can assume the version 0 of the document is an empty piece of paper.
As everything was written in ink and the committee doesn't like to contradict itself, each modification could only add some lines to the end of the document, or erase some lines from the beginning of the document.
Your task is to simulate the making of the Declaration of Independence. Each sentence is represented as an integer number. You need to process the following queries:
- E v x — Copy the document with version v, then add sentence x to the end of the copied document
- D v — Copy the document with version v, then remove the first sentence of the copied document
Queries are numbered from one. The document with version 0 is empty.
In the first line an integer Q, the number of queries. Each of the next Q lines has a query, in the format given in the statement.
Limits
- 1 ≤ Q ≤ 105
- In the ith query it is guaranteed that 0 ≤ v < i
- For each query of type E, x will fit in a 32-bit signed integer
- For each query of type D, it is guaranteed the document will not be empty during the removal of the first sentence
For each query of type D, print the sentence removed.
8
E 0 10
E 0 -10
D 2
D 1
E 2 5
D 5
D 6
D 2
-10
10
-10
5
-10
题意:q个操作,你需要在i是一个队列;
E v x 表示在第v个队列插入x,形成第i个队列;
D v 表示去掉v的对头,形成第i个队列;
思路:主席树,利用线段树第i个点,存储队列第(i-对头的位置)个元素的大小;
利用L,R数组表示这个队列的左端在L[i],右端在R[i]的位置;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define pi (4*atan(1.0))
#define eps 1e-14
#define bug(x) cout<<"bug"<<x<<endl;
const int N=1e5+,M=1e6+,inf=1e9+;
const ll INF=1e18+,mod=1e9+;
struct SGT
{
int ls[N*],rs[N*],rt[N*],L[N*],R[N*],num[N*];
int tot;
void init()
{
tot=;
memset(num,,sizeof(num));
memset(ls,,sizeof(ls));
memset(rs,,sizeof(rs));
memset(rt,,sizeof(rt));
memset(L,,sizeof(L));
memset(R,,sizeof(R));
}
void build(int l,int r,int &pos)
{
pos=++tot;
if(l==r)return;
int mid=(l+r)>>;
build(l,mid,ls[pos]);
build(mid+,r,rs[pos]);
}
void update(int rt,int p,int c,int l,int r,int &pos)
{
pos=++tot;
ls[pos]=ls[rt];
rs[pos]=rs[rt];
if(l==r)
{
num[pos]=c;
return;
}
int mid=(l+r)>>;
if(p<=mid)update(ls[rt],p,c,l,mid,ls[pos]);
else update(rs[rt],p,c,mid+,r,rs[pos]);
}
int query(int p,int l,int r,int pos)
{
if(l==r) return num[pos];
int mid=(l+r)>>;
if(p<=mid)return query(p,l,mid,ls[pos]);
else return query(p,mid+,r,rs[pos]);
}
}tree;
char a[];
int main()
{ int q;
scanf("%d",&q);
//tree.init();
tree.build(,q,tree.rt[]);
tree.L[]=;
tree.R[]=;
for(int i=;i<=q;i++)
{
scanf("%s",a);
if(a[]=='E')
{
int v,x;
scanf("%d%d",&v,&x);
tree.L[i]=tree.L[v];
tree.R[i]=tree.R[v];
tree.update(tree.rt[v],++tree.R[i],x,,q,tree.rt[i]=tree.rt[v]);
}
else
{
int v;
scanf("%d",&v);
tree.L[i]=tree.L[v];
tree.R[i]=tree.R[v];
//cout<<tree.L[v]<<" "<<tree.R[v]<<endl;
printf("%d\n",tree.query(tree.L[i]++,,q,tree.rt[i]=tree.rt[v]));
}
}
return ;
}
/* 8
E 0 10
E 0 -10
D 2
D 1
E 2 5
D 5
D 6
D 2 */
GYM 101064 2016 USP Try-outs G. The Declaration of Independence 主席树的更多相关文章
- gym 101064 G.The Declaration of Independence (主席树)
题目链接: 题意: n个操作,有两种操作: E p c 在序号为p的队列尾部插入c得到新的队列,序号为i D p 查询并删除序号为p的队列顶部的元素,得到序号为i的新队列 思路: 需要查询 ...
- Gym 101064 D Black Hills golden jewels (二分)
题目链接:http://codeforces.com/gym/101064/problem/D 问你两个数组合相加的第k大数是多少. 先sort数组,二分答案,然后判断其正确性(判断过程是枚举每个数然 ...
- 2016年省赛 G Triple Nim
2016年省赛 G Triple Nimnim游戏,要求开始局面为先手必败,也就是异或和为0.如果n为奇数,二进制下最后一位只有两种可能1,1,1和1,0,0,显然异或和为1,所以方案数为0如果n为偶 ...
- 数据结构(主席树):HZOI 2016 采花
[题目描述] 给定一个长度为n,包含c种颜色的序列,有m个询问,每次给出两个数l,r,表示询问区间[l,r]中有多少种颜色的出现次数不少于2次. 本题强制在线,对输入的l,r进行了加密,解密方法为: ...
- codeforces gym #101161E - ACM Tax(lca+主席树)
题目链接: http://codeforces.com/gym/101161/attachments 题意: 给出节点数为$n$的树 有$q$次询问,输出$a$节点到$b$节点路程中,经过的边的中位数 ...
- bzoj4408 [Fjoi 2016]神秘数 & bzoj4299 Codechef FRBSUM 主席树+二分+贪心
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4299 https://lydsy.com/JudgeOnline/problem.php?id ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
- codeforces Gym 100735 D、E、G、H、I
http://codeforces.com/gym/100735 D题 直接暴力枚举 感觉这道题数据有点问题 为什么要先排下序才能过?不懂.. #include <stdio.h> #in ...
- 2016年省赛G题, Parenthesis
Problem G: Parenthesis Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 398 Solved: 75[Submit][Status ...
随机推荐
- How to use CAR FANS C800 Diagnostic Scan Tool to do diagnosis operation
How to use Heavy Duty Diagnostic CAR FANS C800 Diagnostic Scan Tool to do diagnosis operation Here i ...
- spring总结之三(依赖注入)
DI(重要):依赖注入(Dependency Injection).一般情况下,一个类不可能独立完成一个复杂的业务,需要多个类合作共同完成,需要在类中调用其它类的方法,就要给对象赋值,程序在执行过程中 ...
- apache编译安装php后需要注意以下配置
安装后, 编辑apache配置文件 vi /usr/local/apache2/conf/httpd.conf 可以看到 LoadModule php7_module modules/libphp7. ...
- Tensorflow学习笔记03-使用神经网络做线性回归
import tensorflow as tf import numpy as np #input就是输入数据,输入矩阵,in_size就是输入矩阵的列数(数据属性数量),out_size输出矩阵列数 ...
- JDK常用命令(二)jstack
Dump Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到dump文件中.Dump文件一般用来给驱动程序编写人员调试驱动程序用的,在java中用来分析正在运行的程序在内存中的堆栈信息 ...
- JVM的垃圾回收机制
JVM的垃圾回收机制:(GC通过确定对象是否被活动对象引用来确定是否收集该对象.) 1.触发GC(Garbage Collector)的条件. (1.GC在优先级最低的线程中运行,在未运行的线程中进行 ...
- golang BDD testcase framework.
BDD What is Behaviour Driven Development and why should I care? Behaviour Driven Development (BDD) i ...
- TensorFlow 自定义模型导出:将 .ckpt 格式转化为 .pb 格式
本文承接上文 TensorFlow-slim 训练 CNN 分类模型(续),阐述通过 tf.contrib.slim 的函数 slim.learning.train 训练的模型,怎么通过人为的加入数据 ...
- uoj 300 [CTSC2017]吉夫特 - Lucas - 分块 - 动态规划
题目传送门 戳此处转移 题目大意 给定一个长为$n$的序列,问它有多少个长度大于等于2的子序列$b_{1}, b_{2}, \cdots, b_{k}$满足$\prod_{i = 2}^{k}C_{b ...
- django基础 -- 7.Ajax
一.ajax 的特点 1.异步交互:客户端发出一个请求后,需要等待服务器响应结束后, 才能发出第二个请求 2.局部刷新:给用户的感受是在不知不觉中完成请求和响应过程. 二.ajax 模板示例 ($.a ...