链接

这题最不好求的一部分是rank部分 因为top每次都是把一个数放在队头 不会穿插在数组里 也就是说后面没有top过的一部分数 依旧保持有序

这样可以分为两部分来处理 比如 1 2 3 4 5 6 7 TOP 3 TOP 5 TOP 7后 会是这么一种状态 7 5 3    1 2 4 6 这样可以建立两颗线段树一个处理前面一个处理后面

对于N 值很大 肯定是需要离散化的 前面的那颗就可以用普通的求第k大 标记 求和来求出第几 以及x在哪个位置  后面的线段树的值 可以这么来表示 s[w] = num[i]-num[i-1]

这样对于询问rank x  就用线段树找第一个大于等于x的数。

虽然错了很多次,看见那个红红的AC还是很高兴的。。。

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define N 100010
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
struct node
{
char s[];
int d;
}p[N];
int s[N<<],o[N<<],ss[N<<],oo[N<<];
int po[N],fo[N],a[N];
bool vis[N];
map<int,int>f;
void up(int w)
{
s[w] = s[w<<]+s[w<<|];
}
void up1(int w)
{
ss[w] = ss[w<<]+ss[w<<|];
oo[w] = oo[w<<]+oo[w<<|];
}
void build(int l,int r,int w)
{
if(l==r)
{
s[w] = oo[w] = ;
if(fo[l]>fo[l-])
ss[w] = fo[l]-fo[l-];
return ;
}
int m= (l+r)>>;
build(l,m,w<<);
build(m+,r,w<<|);
up(w);
up1(w);
} void update(int pos,int k,int d,int l,int r,int w)
{
if(l==r)
{
s[w] = d;
if(d)
{
po[k] = l;
o[w] = fo[k];
// cout<<k<<" "<<fo[k]<<endl; }
return ;
}
int m = (l+r)>>;
if(pos>m) update(pos,k,d,m+,r,w<<|);
else update(pos,k,d,l,m,w<<);
up(w);
}
void update1(int k,int l,int r,int w)
{
if(l==r)
{
ss[w]--;
oo[w] = ;
return ;
}
int m = (l+r)>>;
if(k>m) update1(k,m+,r,w<<|);
else update1(k,l,m,w<<);
up1(w);
}
int query(int p,int l,int r,int w)
{
if(l==r)
{
return o[w];
}
int m = (l+r)>>;
if(p>s[w<<]) return query(p-s[w<<],m+,r,w<<|);
else return query(p,l,m,w<<);
}
int query1(int p,int l,int r,int w)
{//cout<<l<<" "<<r<<" "<<ss[w]<<" "<<p<<endl;
if(l==r)
{
//cout<<l<<endl;
if(vis[l])
return fo[l]--(ss[w]-p);
else
return fo[l]-(ss[w]-p);
}
int m = (l+r)>>;
if(p<=ss[w<<])
return query1(p,l,m,w<<);
else
return query1(p-ss[w<<],m+,r,w<<|);
}
int getsum(int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r)
return s[w];
int m = (l+r)>>;
int re = ;
if(a<=m)
re+=getsum(a,b,l,m,w<<);
if(b>m)
re+=getsum(a,b,m+,r,w<<|);
return re;
}
int getsum1(int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r)
return oo[w];
int m = (l+r)>>;
int re = ;
if(a<=m)
re+=getsum1(a,b,l,m,w<<);
if(b>m)
re+=getsum1(a,b,m+,r,w<<|);
return re;
}
int main()
{
int i,n,q,kk=,t;
cin>>t;
while(t--)
{
memset(vis,,sizeof(vis));
memset(fo,,sizeof(fo));
memset(o,,sizeof(o));
f.clear();
scanf("%d%d",&n,&q);
for(i = ; i < q; i++)
{
scanf("%s%d",p[i].s,&p[i].d);
a[i] = p[i].d;
}
sort(a,a+q);
int g = ;
for(i = ;i < q ;i++)
{
if(!f[a[i]])
{
g++;
f[a[i]] = g;
fo[g] = a[i];
//cout<<g<<" "<<a[i]<<endl;
}
}
g++;
f[n+] = g;
fo[g] = n+;
g = q+;
build(,g,);
int e = g+;
printf("Case %d:\n",++kk);
for(i = ; i < q ; i++)
{
int k = f[p[i].d];
if(strcmp(p[i].s,"Top")==)
{
e--;
if(vis[k])
update(po[k],k,,,g,);
else
update1(k,,g,);
update(e,k,,,g,);
vis[k]= ;
}
else if(strcmp(p[i].s,"Rank")==)
{
//int sum = getsum(1,g,1,g,1);
//cout<<s[1]<<endl;
//cout<<getsum1(1,2,1,g,1)<<endl;
if(p[i].d>s[])
{
int cnt = query1(p[i].d-s[],,g,);
printf("%d\n",cnt);
}
else
{
printf("%d\n",query(p[i].d,,g,));
}
}
else
{
if(vis[k])
{
int cnt = getsum(,po[k],,g,);
//cout<<po[k]<<endl;
printf("%d\n",cnt);
}
else
{
if(k==g)
cout<<p[i].d<<endl;
else
{
int cnt = getsum1(k+,g,,g,);
printf("%d\n",cnt+p[i].d);
}
}
}
}
}
return ;
}

hdu3436Queue-jumpers(线段树)的更多相关文章

  1. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  2. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  3. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  4. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  5. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  6. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  7. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  8. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  9. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  10. 【BZOJ-2653】middle 可持久化线段树 + 二分

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1298  Solved: 734[Submit][Status][Discu ...

随机推荐

  1. android KE or NE分析

    使用arm-eabi-addr2line工具跟踪Android调用堆栈 在通常的C/C++代码中,可以通过响应对内存操作不当引起的Segmentation Fault错误即信号SIGSEGV(11)做 ...

  2. CSS多种方法实现分隔线

    <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" /> <title&g ...

  3. 全文检索(二)-基于lucene4.10的增删改查

    今天 用lucene完毕了 一个简单的web应用.提取了早期编写的一个測试类. 首先简单介绍下lucene几个经常使用包; lucene 包的组成结构:对于外部应用来说索引模块(index)和检索模块 ...

  4. 添加 XML内Rows数据

    public static void addItemToXml(string method,string firstKey,string id,string checkName,string refV ...

  5. 使用Base64进行string的加密和解密 公钥加密—私钥签名

    使用Base64进行string的加密和解密   //字符串转bytesvar ebytes = System.Text.Encoding.Default.GetBytes(keyWord);//by ...

  6. 2016/05/25 empty() 与 isset()的区别

    对于初学php的人来说,empty()和和isset()用法的区别是很难搞清楚的,他们的用法的差别不仔细去琢磨的话确实很难弄清楚. 先说一下他们的共同点: 都可以判定一个变量是否为空: 都返回bool ...

  7. C++的cout高阶格式化操作

    这篇文章主要讲解如何在C++中使用cout进行高级的格式化输出操作,包括数字的各种计数法(精度)输出,左或右对齐,大小写等等.通过本文,您可以完全脱离scanf/printf,仅使用cout来完成一切 ...

  8. HDU1698 Just a Hook —— 线段树 区间染色

    题目链接:https://vjudge.net/problem/HDU-1698 In the game of DotA, Pudge’s meat hook is actually the most ...

  9. What's the difference between HEAD, working tree and index, in Git?

    What's the difference between HEAD, working tree and index, in Git?

  10. 关于页面上输入框中 空格 、0 、NULL 的处理 示例

    ep.setPositionNum(get("positionNum").toString()); ep.setClasstype(get("classtype" ...