Battle with You-Know-Who

Time limit: 2.0 second
Memory limit: 64 MB
Rooms of the Ministry of Magic are enchanted with a spell which enumerates them automatically. The spell works as follows. The first room created at the Ministry got the number 1. When a new room is created by magic, a number-plate appears at once upon the door. The new number is greater by one than the maximal room number existing at the moment. If a room is not needed anymore, then it is destroyed and all the room numbers that are greater than the number of the destroyed room are lessened by one. Thus, the numeration of the rooms at the Ministry always remains continuous.
Harry Potter found out a list of the numbers of the rooms where Lord Voldemort's Horcruxes are stored (A Horcrux is a magical artifact that provides for the owner's immortality). It seems that now it will be easy for Harry to find the Horcruxes and destroy them. But the task turned out to be more complicated. Because of his mysterious bond with Harry, Voldemort knew at once about Harry's discovery, so he transported himself to the Ministry and started to destroy rooms. This means that numbers of rooms are changing, so when Harry looks at a room's door, he doesn't know which number this door had before. But he knows which numbers were on the doors of the rooms that were destroyed by Voldemort, due to the mentioned bond between them.
Help Harry to defeat Voldemort. You don't have to fight Harry's enemy, but you can help him to determine the true numbers of rooms when he looks at their doors.

Input

The first line contains the number of rooms at the Ministry of Magic N (1 ≤ N ≤ 109) and a numberM (1 ≤ M ≤ 105). Each of the subsequent M lines has the following format:
<letter> <number>
where <letter> is one of the letters 'D' (Destroy) or 'L' (Look at), and <number> is the number on the door of the room which is destroyed or at which Harry looks at the moment. It is guaranteed that not more than 104 rooms will be destroyed during the battle.

Output

The output must contain for each line
L <number>
of the input the true number (which it had before the battle) of the room at which Harry looks. The numbers must be given one in a line.

Sample

input output
20 7
L 5
D 5
L 4
L 5
D 5
L 4
L 5
5
4
6
4
7

分析:参考了两个做法,第一个比较玄,不太好理解,只能写几个证明貌似是对的;

   第二个就是treap树了,参考http://blog.csdn.net/u011686226/article/details/39005875;

   treap树插入询问第K大,询问时二分,询问mid时小于等于mid数有y个,那么mid是第mid-y大的数;

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <hash_map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define Lson L, mid, rt<<1
#define Rson mid+1, R, rt<<1|1
const int maxn=1e5+;
const int dis[][]={,,-,,,-,,};
using namespace std;
using namespace __gnu_cxx;
ll gcd(ll p,ll q){return q==?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=;while(q){if(q&)f=f*p%mod;p=p*p%mod;q>>=;}return f;}
int n,m,k,t,a[maxn],now;
char op[];
int main()
{
int i,j;
a[]=2e9;
scanf("%d%d",&m,&n);
while(n--)
{
scanf("%s%d",op,&k);
int l=,r=now,ans;
while(l<=r)
{
int mid=l+r>>;
if(a[mid]>k)ans=mid,r=mid-;
else l=mid+;
}
if(op[]=='L')printf("%d\n",k+ans);
else
{
for(int i=ans;i<now;i++)a[i]--;
for(int i=now;i>ans;i--)a[i]=a[i-];
a[++now]=2e9;
a[ans]=k;
}
}
//system("Pause");
return ;
}

treap树:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std; const int maxm = ;
int ch[maxm][], r[maxm], val[maxm], sum[maxm], num[maxm], cnt, root; void Node(int &rt, int x){
rt = ++cnt;
ch[rt][] = ch[rt][] = ;
r[rt] = rand();
val[rt] = x;
if(cnt > )
{
sum[rt] = ;
num[rt] = ;
}
else
{
sum[rt] = ;
num[rt] = ;
}
}
void maintain(int rt){ sum[rt] = sum[ch[rt][]]+sum[ch[rt][]]+num[rt];
}
void init()
{
ch[][] = ch[][] = ;
r[] = (1LL<<)-;
val[] = ;
sum[] = ;
cnt = ;
root = ;
Node(root, );
} void rotate(int &rt, int d){
int k = ch[rt][d^]; ch[rt][d^] = ch[k][d]; ch[k][d] = rt;
maintain(rt); maintain(k); rt = k;
} void insert(int &rt, int x){
if(!rt){
Node(rt, x);
return;
}
else{
if(x == val[rt])
num[rt]++;
else
{
int d = x < val[rt] ? : ;
insert(ch[rt][d], x);
if(r[ch[rt][d]] < r[rt]) rotate(rt, d^);
}
}
maintain(rt);
} /*void remove(int &rt, int x){
if(val[rt] == x){
val[rt]--;
if(!val[rt]){
if(!ch[rt][0] && !ch[rt][1])
{
rt = 0;
return;
}
else{
int d = r[ch[rt][0]] > r[ch[rt][1]] ? 1 : 0;
rotate(rt, d);
remove(ch[rt][d], x);
}
else{ }
}
}
else
remove(ch[rt][x>val[rt]], x);
maintain(rt);
}*/ int kth(int rt, int k){
if(rt == )
return ;
if(val[rt] <= k)
return sum[ch[rt][]]+num[rt]+kth(ch[rt][], k);
return kth(ch[rt][], k);
} int main()
{
int n, m;
while(scanf("%d %d", &n, &m) != EOF)
{
init();
while(m--)
{
char s[];
int x;
scanf("%s %d", s, &x);
int l = , r = n, ans;
while(l<=r)
{
int mid=l+r>>,y=kth(root,mid);
if(x<=mid-y)ans=mid,r=mid-;
else l=mid+;
}
if(s[] == 'L')
{
printf("%d\n", ans);
}
else
{
insert(root, ans);
}
}
}
//system("pause");
return ;
}

ural1439 Battle with You-Know-Who的更多相关文章

  1. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  2. Codeforces 738D. Sea Battle 模拟

    D. Sea Battle time limit per test: 1 second memory limit per test :256 megabytes input: standard inp ...

  3. Codeforces #380 div2 D(729D) Sea Battle

    D. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  4. The 2015 China Collegiate Programming Contest C. The Battle of Chibi hdu 5542

    The Battle of Chibi Time Limit: 6000/4000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Othe ...

  5. get a new level 25 battle pet in about an hour

    If you have 2 level 25 pets and any level 1 pet, obviously start with him in your lineup. Defeat all ...

  6. 需求文档2_The Battle of Polytopia

    需求文档 ------------------------------------- 1. 游戏详细分析 The Battle of Polytopia简要介绍 探索型.策略型的对战塔防游戏,回合制. ...

  7. Codeforces 567D One-Dimensional Battle Ships

    传送门 D. One-Dimensional Battle Ships time limit per test 1 second memory limit per test 256 megabytes ...

  8. Codeforces Round #Pi (Div. 2) D. One-Dimensional Battle Ships set乱搞

    D. One-Dimensional Battle ShipsTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/con ...

  9. PAT 解题报告 1013. Battle Over Cities (25)

    1013. Battle Over Cities (25) t is vitally important to have all the cities connected by highways in ...

随机推荐

  1. @font-face的用法

    几乎所有浏览器(包括最古老的IE6)也支持的网络字体@font-face的用法是: @font-face { font-family: 'MyWebFont'; src: url('webfont.e ...

  2. Google 分布式关系型数据库 F1

    F1是Google开发的分布式关系型数据库,主要服务于Google的广告系统.Google的广告系统以前使用MySQL,广告系统的用户经常需要使用复杂的query和join操作,这就需要设计shard ...

  3. postgres-xl 集体搭建(1)

    安装并编辑脚本 cd /opt/curl -O http://files.postgres-xl.org/postgres-xl95r1beta1.tar.gztar -zxvf postgres-x ...

  4. 数据库NULL和 ‘’ 区别

    NULL判断时 : IS NOT NULL ''判断时: !=''

  5. code.google.com

    https://github.com/couchbase/sync_gateway/issues/492 This list shows the current base import paths, ...

  6. C#生成随机汉字

    using System; using System.Text; namespace ConsoleApplication {     class ChineseCode     {          ...

  7. 【servlet】客户端是否可以访问到WEB-INF下的jsp文件

    一般情况下(不考虑出现安全问题被入侵,那样啥都能访问到),WEB-INF下的jsp文件单凭浏览器端请求时访问不到的. 想访问的话需要通过服务端servlet的转发. 下面通过转发和重定向的尝试来观察访 ...

  8. OpenGL 图形管道(graphics pipeline)过程

    1.总结:Graphics pipeline 主要分为两部分工作 把3D坐标转换成2D坐标 把2D坐标转换成真实的有颜色的像素 2.下图就是一个顶点数据经过几个步骤后转化成显示在屏幕上像素的过程(一般 ...

  9. Spring Boot 系列教程17-Cache-缓存

    缓存 缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找.由于缓存的运行速度比内存快得多,故缓存的作用就是帮 ...

  10. Android 系统编译

    最近研究了下Android 的编译系统,下面结合编译我们自己的产品 mobot 来对整个编译系统进行必要的介绍,方便大家今 后对默认编译的修改. 先列出几个觉得重要的Make 文件: build/bu ...