hdu 3436 线段树 一顿操作
Queue-jumpers
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3348 Accepted Submission(s): 904
line initially. Each time you should simulate one of the following operations:
1. Top x :Take person x to the front of the queue
2. Query x: calculate the current position of person x
3. Rank x: calculate the current person at position x
Where x is in [1, N].
Ponyo is so clever that she plays the game very well while Garfield has no idea. Garfield is now turning to you for help.
In each case, the first line contains two integers N(1<=N<=10^8), Q(1<=Q<=10^5). Then there are Q lines, each line contain an operation as said above.
Sample Input
3
9 5
Top 1
Rank 3
Top 7
Rank 6
Rank 8
6 2
Top 4
Top 5
7 4
Top 5
Top 2
Query 1
Rank 6
Sample Output
Case 1:
3
5
8
Case 2:
Case 3:
3
6
/*
hdu 3436 线段树 一顿操作 这个题以前用splay树做过,但是最近练习线段树中(据说线段树能解决splay树中的很多操作)
Top: 将第x个数移动到队首
Query: 查询x的位置
Rank: 找出排第x的数 top想的数之间在线段树前面预留一部分,于是线段树最多需要2e5.对于Rank可以直接查找
主要是对于Query没想到什么办法.最后直接是用数组来保存每个数的位置,然后利用求和便能得到
某数在这个队列中的位置 hhh-2016-04-12 19:20:16
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <functional>
typedef long long ll;
#define lson (i<<1)
#define rson ((i<<1)|1)
using namespace std; const int maxn = 1e6+10; struct node
{
int l,r;
int sum,val;
int mid()
{
return (l+r)>>1;
}
} tree[maxn<<2];
int T,n,m;
int a[maxn];
int ano[maxn];
int st[maxn],en[maxn];
int pos[maxn];
char op[maxn][6];
int tot,TOT; void push_up(int i)
{
tree[i].sum = tree[lson].sum + tree[rson].sum;
} void build(int i ,int l,int r)
{
tree[i].l =l ,tree[i].r = r;
tree[i].sum = 0;
tree[i].val = 0;
if(l == r)
{
if(tree[i].l > m)
{
int t = tree[i].l-m;
tree[i].val = t;
tree[i].sum = en[t]-st[t]+1;
}
return ;
}
int mid = tree[i].mid();
build(lson,l,mid);
build(rson,mid+1,r);
push_up(i);
} void push_down(int i)
{ } void update(int i,int k,int val)
{
if(tree[i].l == tree[i].r )
{
if(!val) tree[i].sum = 0,tree[i].val = 0;
else tree[i].sum = en[val]-st[val]+1,tree[i].val = val;
return ;
}
int mid = tree[i].mid();
if(k <= mid)
update(lson,k,val);
else
update(rson,k,val);
push_up(i);
} int sum(int i,int l,int r)
{
if(tree[i].l>=l && tree[i].r <= r)
return tree[i].sum;
int mid = tree[i].mid();
int su = 0;
if(l <= mid)
su += sum(lson,l,r);
if(r > mid)
su += sum(rson,l,r);
push_up(i);
return su;
} int get_k(int i,int k)
{
if(tree[i].l == tree[i].r && k <= en[tree[i].val]-st[tree[i].val]+1)
return st[tree[i].val]+k-1;
int mid = tree[i].mid(); if(k <= tree[lson].sum)
return get_k(lson,k);
else
return get_k(rson,k-tree[lson].sum);
push_up(i);
} int bin(int key)
{
int l = 1,r = tot-1;
while(l <= r)
{
int mid = (l+r)>>1;
if(st[mid]<=key && en[mid]>=key)
return mid;
else if(key < st[mid])
r = mid - 1;
else
l = mid + 1;
}
} int main()
{
int cas = 1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
tot = 0;
for(int i = 1; i <= m; i++)
{
scanf("%s%d",op[i],&a[i]);
if(op[i][0] == 'T' || op[i][0] == 'Q')
ano[tot++] = a[i];
}
ano[tot++] = 1,ano[tot++] = n;
sort(ano,ano+tot);
// for(int i = 0;i < tot;i++)
// cout << ano[i] <<" ";
// cout << endl;
TOT = tot;
tot = 1;
st[tot] = ano[0],en[tot] = ano[0];
tot++;
printf("Case %d:\n",cas++);
for(int i = 1; i < TOT; i++)
{
if(ano[i] != ano[i-1])
{
if(ano[i] - ano[i-1] > 1)
{
st[tot] = ano[i-1]+1;
en[tot++] = ano[i]-1;
}
st[tot] = ano[i];
en[tot] = ano[i];
tot++;
}
}
// for(int i = 1;i < tot;i++)
// cout <<st[i] << " "<<en[i] <<endl;
build(1,1,m+tot-1);
memset(ano,0,sizeof(ano));
int cur = m;
for(int i = 1; i <= m; i++)
{
int tp = bin(a[i]);
//cout << "val:" << a[i] << " "<<tp<<endl;
if(op[i][0] == 'T')
{
if(ano[tp])
{
update(1,pos[tp],0);
update(1,cur,tp);
pos[tp] = cur;
cur --;
}
else
{
update(1,m+tp,0);
update(1,cur,tp);
pos[tp] = cur;
cur--;
ano[tp] = 1;
}
}
else if(op[i][0] == 'Q')
{
if(ano[tp])
{
printf("%d\n",sum(1,1,pos[tp]));
}
else
{
printf("%d\n",sum(1,1,m+tp));
}
}
else
{
printf("%d\n",get_k(1,a[i]));
}
}
}
return 0;
}
hdu 3436 线段树 一顿操作的更多相关文章
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 4267 线段树间隔更新
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
- hdu 1754 线段树(Max+单点修改)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 3436 splay树+离散化*
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- Can you answer these queries? HDU 4027 线段树
Can you answer these queries? HDU 4027 线段树 题意 是说有从1到编号的船,每个船都有自己战斗值,然后我方有一个秘密武器,可以使得从一段编号内的船的战斗值变为原来 ...
- 线段树区间更新操作及Lazy思想(详解)
此题题意很好懂: 给你N个数,Q个操作,操作有两种,‘Q a b ’是询问a~b这段数的和,‘C a b c’是把a~b这段数都加上c. 需要用到线段树的,update:成段增减,query:区间求 ...
随机推荐
- 201621123057 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 在上一周的总结上做了一点补充 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1. ...
- 【译】Gradle 的依赖关系处理不当,可能导致你编译异常
文章 | Ashesh Bharadwaj 翻译 | 承香墨影 授权 承香墨影 翻译.编辑并发布 在 Android Studio 中,Gradle 构建过程对于开发者来说,很大程度上是抽象的.作为一 ...
- Aache的虚拟主机配置虚拟目录
3. 打开 httpd.conf 文件, 添加如下代码: # Virtual hosts Include conf/extra/httpd-vhosts.conf 如果已存在,将Include前面的# ...
- mysql数据库基本操作
下载地址 http://www.mysql.com/downloads/mysql/ 端口号:3306 用户名:root 密码:自定义 连接到MySQL服务器 >mysql -uroot -pr ...
- css3兼容IE8的方案 各个ie的hack
虽然现在很多项目已经对低版本IE不要求了,但是还有部分公司对IE8还是很执着的,咱作为屌丝前端程序员不能和老板说前端潮流,不能说趋势,只能动脑子了,下面就分享一些css3兼容ie8的方案思路.主要是实 ...
- Python内置函数(56)——locals
英文文档: locals() Update and return a dictionary representing the current local symbol table. Free var ...
- JSON(二)——JavaScript中js对象与JSON格式字符串的相互转换
首先我们来看一下js中JSON格式的字符串 var JSONStr1 = "{\"name\" : \"张三\"}"; 注意以下的写法不是j ...
- Python之格式化输出,初始编码以及运算符
一.题型 1.使用while循环输入 1 2 3 4 5 6 8 9 10 count = 0 while count < 10: count += 1 #count = count + ...
- 初识JavaScript闭包
一个问题引发的思考 在我学习javascript的事件时,有一个小任务是使用JS来实现 li 列表项在鼠标悬浮时会有背景阴影的动态效果,很自然想到用for 来为每个列表项添加onmouseover 和 ...
- jq中的表单验证插件------jquery.validate
今天我们来说一下表单验证,有人说我们在进行表单验证的时候使用正则来验证是非常麻烦的,现在我来给大家介绍一下表单验证的插件:jquery.validate.min.js 它是与jquery一起结合用来使 ...