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 ...
随机推荐
- 安装DotNetCore.1.0.0-VS2015Tools.Preview2一直失败,如何解?
首先要说明的一点是,本地的VS2015的环境已经安装完成,而且vs2015.3也已经更新完成了,这个环境应该是没啥问题.但是安装.DotNetCore.1.0.0-VS2015Tools.Previe ...
- How to install john deere service advisor 4.2.005 on win 10 64bit
How to install john deere service advisor 4.2.005 with the February 2016 data base disks on a machin ...
- spark读取hbase形成RDD,存入hive或者spark_sql分析
object SaprkReadHbase { var total:Int = 0 def main(args: Array[String]) { val spark = SparkSession . ...
- Kattis之旅——Perfect Pth Powers
We say that x is a perfect square if, for some integer b, x = b2. Similarly, x is a perfect cube if, ...
- Prometheus监控学习笔记之Prometheus监控简介
0x00 Prometheus容器监控解决方案 Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的.它是一个独立的开放源码项目,并且独立于任何公司.不同 ...
- P2763 试题库问题(dinic)
P2763 试题库问题 dinic 搞个虚拟源点和汇点,瞎建建边就好辣. 偷张图↓↓ 如果没满流就是无解辣 输出方案咋办呢? 枚举每种类型,蓝后枚举它们的边 如果该边被使用了(通过判断反向边的流量), ...
- 【题解】Luogu UVA1411 Ants
原题传送门 博客里对二分图匹配的详细介绍 这道题是带权二分图匹配 用的是KM算法 我们要知道一个定理:要使线段没有相交,要使距离总和最小 我们先把任意一对白点.黑点的距离算一下 然后运用KM算法 因为 ...
- 如何将你的github仓库部署到github pages(转)
原文地址:http://www.cnblogs.com/yuanzm/p/3945814.html#commentform 很多时候我都在思考一个问题,我们每天遇到各种各样的问题,然后我们需要不断go ...
- 【Python55--爬虫:代理】
一.反爬虫之隐藏 1.网站检查访问的是正常用户还是程序,关键在于User-Agent 1).第一种方法:采用header --修改header(两种方法): --> 在Request之前通过h ...
- topcoder srm 690 div1 -3
1.给定一个数字$N$,从1到100的100个数字中选出$K$个数字(设为集合$S$),然后对$S$进行如下运算: (1)删除$S$中的某些数字:(可以删除0个数字) (2)将$S$中的某些数字取为它 ...