KiKi's K-Number

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2546    Accepted Submission(s): 1174

Problem Description
For the k-th number, we all should be very familiar with it. Of course,to kiki it is also simple. Now Kiki meets a very similar problem, kiki wants to design a container, the container is to support the three operations.



Push: Push a given element e to container



Pop: Pop element of a given e from container



Query: Given two elements a and k, query the kth larger number which greater than a in container;



Although Kiki is very intelligent, she can not think of how to do it, can you help her to solve this problem?
 
Input
Input some groups of test data ,each test data the first number is an integer m (1 <= m <100000), means that the number of operation to do. The next m lines, each line will be an integer p at the beginning, p which has three values:

If p is 0, then there will be an integer e (0 <e <100000), means press element e into Container.



If p is 1, then there will be an integer e (0 <e <100000), indicated that delete the element e from the container  



If p is 2, then there will be two integers a and k (0 <a <100000, 0 <k <10000),means the inquiries, the element is greater than a, and the k-th larger number.
 
Output
For each deletion, if you want to delete the element which does not exist, the output "No Elment!". For each query, output the suitable answers in line .if the number does not exist, the output "Not Find!".
 
Sample Input
5
0 5
1 2
0 6
2 3 2
2 8 1
7
0 2
0 2
0 4
2 1 1
2 1 2
2 1 3
2 1 4
 
Sample Output
No Elment!
6
Not Find!
2
2
4
Not Find!

三种操作,0 代表加入一个数x。1代表删除一个数x。2代表 找比a大的第k个数,使用线段树求解,线段树统计在一个区间内出现的数的个数,对于找比a大的第k个数。从a開始向后查找,假设在某段中累加的和大于k。就让它跳入这段中,直到深入到一个叶子节点时,刚好ans >= k。

对线段树的更新不解释,主要是查询的时候

1.假设当前区间[l,r]中 r<=a那么这一段的数都不用统计。

2.假设r >a,代表该段中存在比a大的数就要向下深入。

3.假设l > a,那么该段中所有的点都会大于a,開始推断。假设该段所有增加后仍然小于k。那么就能够所有增加。假设加进去以后大于等于k,那么就要向下深入。一直深入到叶子节点,满足条件的,最左的叶子节点就是我们要求的值。(线段树。从左向右查找。一定能够找到第一个)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 110000
#define lmin 1
#define rmax n
#define lson l,(l+r)/2,rt<<1
#define rson (l+r)/2+1,r,rt<<1|1
#define root lmin,rmax,1
#define now l,r,rt
#define int_now int l,int r,int rt
int cl[maxn<<2] , k1[maxn] , k2[maxn<<2] , top ;
void push_up(int_now)
{
cl[rt] = cl[rt<<1] + cl[rt<<1|1] ;
}
void creat(int_now)
{
cl[rt] = 0 ;
if(l != r)
{
creat(lson);
creat(rson);
push_up(now);
}
else
{
cl[rt] = 0 ;
k2[rt] = ++top ;
}
}
void update(int x,int d,int_now)
{
if( l > x || r < x )
return ;
if( l == r && l == x )
{
cl[rt] += d ;
return ;
}
update(x,d,lson);
update(x,d,rson);
push_up(now);
}
int query(int ll,int ans,int num,int_now)
{
if( r <= ll )
return 0;
if( ll < l )
{
if( ans + cl[rt] < num )
return ans + cl[rt] ;
if(ans < num && ans + cl[rt] >= num && l == r )
{
printf("%d\n", k2[rt] );
return ans + cl[rt] ;
}
if(ans < num && ans + cl[rt] >= num )
{
if( ans + cl[rt<<1] >= num )
ans = query(ll,ans,num,lson);
else
ans = query(ll,ans+cl[rt<<1],num,rson);
return ans ;
}
}
else
{
if( ans < num )
ans = query(ll,ans,num,lson);
if(ans < num)
ans = query(ll,ans,num,rson);
return ans;
}
}
int main()
{
int m , i , n , l , r , x , temp , num ;
while(scanf("%d", &m) != EOF)
{
top = 0 ;
n = maxn ;
creat(root);
memset(k1,0,sizeof(k1));
while(m--)
{
scanf("%d", &temp);
if( temp == 0 )
{
scanf("%d", &x);
k1[x]++ ;
update(x,1,root);
}
else if( temp == 1 )
{
scanf("%d", &x);
if( k1[x] == 0 )
printf("No Elment!\n");
else
{
k1[x]-- ;
update(x,-1,root);
}
}
else
{
scanf("%d %d", &l, &num);
x = query(l,0,num,root);
if(x < num)
printf("Not Find!\n");
}
}
} }

版权声明:转载请注明出处:http://blog.csdn.net/winddreams

hdu2852--KiKi&#39;s K-Number(段树,求第一k的数量)的更多相关文章

  1. POJ 2104 K-th Number 主席树(区间第k大)

    题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...

  2. poj-1151-Atlantis-线段树求面积并

    非常裸的线段树求面积并. 坐标须要离散化一下. #include<stdio.h> #include<iostream> #include<stdlib.h> #i ...

  3. hdu-3642--Get The Treasury-线段树求面积并

    求空间中叠加3次及3次以上的体积. 由于|z|<=500.所以直接把z轴剥离出来1000层. 然后对于每一层进行线段树求面积并. #include<stdio.h> #include ...

  4. 树状数组求第K小值 (spoj227 Ordering the Soldiers &amp;&amp; hdu2852 KiKi&#39;s K-Number)

    题目:http://www.spoj.com/problems/ORDERS/ and pid=2852">http://acm.hdu.edu.cn/showproblem.php? ...

  5. hdu2852 KiKi&#39;s K-Number

    Problem Description For the k-th number, we all should be very familiar with it. Of course,to kiki i ...

  6. [hdu2665]Kth number(划分树求区间第k大)

    解题关键:划分树模板题. #include<cstdio> #include<cstring> #include<algorithm> #include<cs ...

  7. HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板

    好久没写过博客了,这学期不是很有热情去写博客,写过的题也懒得写题解.现在来水一水博客,写一下若干年前的题目的题解. Atlantis Time Limit: 2000/1000 MS (Java/Ot ...

  8. [HDU] 1394 Minimum Inversion Number [线段树求逆序数]

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  9. POJ 2777.Count Color-线段树(区间染色+区间查询颜色数量二进制状态压缩)-若干年之前的一道题目。。。

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 53312   Accepted: 16050 Des ...

随机推荐

  1. Xtext什么

    在Xtext官方网站是这么说的 "Building your own domain-specific languages has never been so easy. Just put y ...

  2. 服务器编程入门(1)TCP/IP协议族

    问题聚焦: 简单地梳理一下TCP/IP各层的功能和常用协议 详细了解ARP(数据链路层)和DNS(应用层)协议的工作原理 1 TCP/IP协议族体系结构 数据链路层:     职责:实现网卡接口的网络 ...

  3. 开放源代码的微微信.NET 0.8 版公布了

    微微信.NET 0.8 版公布了     A.源代码应用范围:         未认证的和经过认证的微信订阅号.微信服务号均可使用,本源代码的每个模块都提供全然的 ASP.NET C#源代码,绝对不含 ...

  4. linux下用shell删除三天前或者三天内的文件

    说明:+n 大于 n, -n 小于 n, n 相等于 n. find / -amin -30 -ls # 查找在系统中最后30分钟访问的文件find / -atime -2 -ls # 查找在系统中最 ...

  5. CentOS修改yum更新源

    1. 在修改前先备份该文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2. 修改更新源配置文 ...

  6. SVN的命令行操作

    最近在进行svn二次开发,使用的是svnkit.看了很多svnkit的api,渐渐发现都是和SVN的命令行操作对应的.顺便研究一下svn的命名行操作. 1.将文件checkout到本地目录: 基本命令 ...

  7. sql小技巧 group by datetime类型字段,只取其中的日期部分

    工作中经常会遇到,要在sql中查询报表,查询结果要求按照日期来罗列, 或按照天, 或按照月,年. 这个时候我们经常会苦恼,datetime是精确到毫秒的,如果单纯的group by datetime就 ...

  8. Acquire and Release Semantics

    An operation has acquire semantics if other processors will always see its effect before any subsequ ...

  9. C#开发Linux守护进程

    用C#开发Linux守护进程   Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon ...

  10. codeforece Round#311 BCDE

    B题 给我们n,m ,  m表示茶壶的容量 接下来2*n个数字,表示茶杯的容量,将这些茶杯分给n个男孩和n个女孩 可以倒x毫升的茶水给每个女孩,那么就要倒2x毫升的茶水给男孩,当然了,茶杯要装的下,且 ...