hdu2852--KiKi's K-Number(段树,求第一k的数量)
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
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?
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.
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
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's K-Number(段树,求第一k的数量)的更多相关文章
- POJ 2104 K-th Number 主席树(区间第k大)
题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...
- poj-1151-Atlantis-线段树求面积并
非常裸的线段树求面积并. 坐标须要离散化一下. #include<stdio.h> #include<iostream> #include<stdlib.h> #i ...
- hdu-3642--Get The Treasury-线段树求面积并
求空间中叠加3次及3次以上的体积. 由于|z|<=500.所以直接把z轴剥离出来1000层. 然后对于每一层进行线段树求面积并. #include<stdio.h> #include ...
- 树状数组求第K小值 (spoj227 Ordering the Soldiers && hdu2852 KiKi's K-Number)
题目:http://www.spoj.com/problems/ORDERS/ and pid=2852">http://acm.hdu.edu.cn/showproblem.php? ...
- hdu2852 KiKi's K-Number
Problem Description For the k-th number, we all should be very familiar with it. Of course,to kiki i ...
- [hdu2665]Kth number(划分树求区间第k大)
解题关键:划分树模板题. #include<cstdio> #include<cstring> #include<algorithm> #include<cs ...
- HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板
好久没写过博客了,这学期不是很有热情去写博客,写过的题也懒得写题解.现在来水一水博客,写一下若干年前的题目的题解. Atlantis Time Limit: 2000/1000 MS (Java/Ot ...
- [HDU] 1394 Minimum Inversion Number [线段树求逆序数]
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- POJ 2777.Count Color-线段树(区间染色+区间查询颜色数量二进制状态压缩)-若干年之前的一道题目。。。
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 53312 Accepted: 16050 Des ...
随机推荐
- Xtext什么
在Xtext官方网站是这么说的 "Building your own domain-specific languages has never been so easy. Just put y ...
- 服务器编程入门(1)TCP/IP协议族
问题聚焦: 简单地梳理一下TCP/IP各层的功能和常用协议 详细了解ARP(数据链路层)和DNS(应用层)协议的工作原理 1 TCP/IP协议族体系结构 数据链路层: 职责:实现网卡接口的网络 ...
- 开放源代码的微微信.NET 0.8 版公布了
微微信.NET 0.8 版公布了 A.源代码应用范围: 未认证的和经过认证的微信订阅号.微信服务号均可使用,本源代码的每个模块都提供全然的 ASP.NET C#源代码,绝对不含 ...
- linux下用shell删除三天前或者三天内的文件
说明:+n 大于 n, -n 小于 n, n 相等于 n. find / -amin -30 -ls # 查找在系统中最后30分钟访问的文件find / -atime -2 -ls # 查找在系统中最 ...
- CentOS修改yum更新源
1. 在修改前先备份该文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2. 修改更新源配置文 ...
- SVN的命令行操作
最近在进行svn二次开发,使用的是svnkit.看了很多svnkit的api,渐渐发现都是和SVN的命令行操作对应的.顺便研究一下svn的命名行操作. 1.将文件checkout到本地目录: 基本命令 ...
- sql小技巧 group by datetime类型字段,只取其中的日期部分
工作中经常会遇到,要在sql中查询报表,查询结果要求按照日期来罗列, 或按照天, 或按照月,年. 这个时候我们经常会苦恼,datetime是精确到毫秒的,如果单纯的group by datetime就 ...
- Acquire and Release Semantics
An operation has acquire semantics if other processors will always see its effect before any subsequ ...
- C#开发Linux守护进程
用C#开发Linux守护进程 Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon ...
- codeforece Round#311 BCDE
B题 给我们n,m , m表示茶壶的容量 接下来2*n个数字,表示茶杯的容量,将这些茶杯分给n个男孩和n个女孩 可以倒x毫升的茶水给每个女孩,那么就要倒2x毫升的茶水给男孩,当然了,茶杯要装的下,且 ...