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:区间求 ...
随机推荐
- C语言--期末总结
一. 1.当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 答:当初报志愿的时候,没有具体的想法,只凭借着 ...
- 第四十三条:返回零长度的数组或者集合,而不是null
如果一个方法的返回值类型是集合或者数组 ,如果在方法内部需要返回的集合或者数组是零长度的,也就是没有实际对象在里面, 我们也应该放回一个零长度的数组或者集合,而不是返回null.如果返回了null,客 ...
- PHP获取短信验证码
PHP如何获取短信验证码?以下是创蓝253短信平台下的PHP接口代码案例: <?php header("Content-type:text/html; charset=UTF-8& ...
- 读取.properties的内容1
属性文件方便于项目进行更改,在项目开发中用的也是非常的普遍,在这里就把属性文件的读取通过代码进行一个小结: package com.oyy.test; import java.io.BufferedI ...
- datable转xml
/// <summary> /// datatable转换xml /// </summary> /// <param name="xmlDS"> ...
- WPS怎么让前几页的页眉或者页脚与后面的不同
其实不管利用WPS还是office对文档还是PPT进行操作,其实核心思想还是一种编程,主要是前端的编程,就是通过改变一些这些软件设置的样式,然后通过改变这些样式,使这些文字以老师要求的格式显示出来的, ...
- EasyUI DataGrid 实现单行/多行编辑功能
要实现 EasyUI DataGrid 的可编辑很简单,在需要编辑的列添加 editor [编辑器]就可以了. 单行编辑 // 初始化数据列表 function initDatagrid() { $( ...
- 数据库 MYSQL操作(一)
数据库 MYSQL操作总结(一) 本文主要介绍一下笔者在使用数据库操作的过程中的一些总结,主要的内容包括一下几个内容: 一.mysql 使用基础(主要包括数据库的安装.基本操作等内容) 二.mysq ...
- Django 使用celery任务队列的配置
celery 情景:用户发起request,并等待response返回.在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件.手机验证码等. 使用 ...
- leetcode算法:Distribute Candies
Given an integer array with even length, where different numbers in this array represent different k ...