树状数组求第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? pid=2852
题意:spoj227:告诉每一个位置前面有多少个数比当前位置小,求出原序列。
hdu2852:设计一个容器,支持几种操作:添加/删除元素,求容器中比a大的数中第k小的数是多少。
分析:两个题思路都是求数组里面的第K小的数。開始一直在找O(N*logN)的方法,后来发现O(N*logN*logN)也是能够过的。。
。
两步:和先前的逆序数一样先用树状数组处理好比x小的数有多少个,然后二分~(值是单调的)
spoj227代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 2e5+6;
int lowbit[maxn],a[maxn],tree[maxn];
void GetLowbit()
{
for(int i=1;i<maxn;i++)
lowbit[i]=i&-i;
}
void update(int x,int v)
{
for(int i=x;i<maxn && i;i+=lowbit[i])
tree[i]+=v;
}
int query(int x)
{
int ret(0);
for(int i=x;i>0;i-=lowbit[i])
ret+=tree[i];
return ret;
}
int Find(int x,int n)
{
int ret=1e9,down=1,mid,up=n,v;
while(down<=up)
{
mid=(down+up)>>1;
v=query(mid);
if(v>=x)
{
up=mid-1;
if(mid<ret && x==v)
ret=mid;
}
else
down=mid+1;
}
return ret;
}
int main()
{
GetLowbit();
int ncase,n,x,y,v,i,j;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d",&n);
memset(tree,0,sizeof(tree[0])*(n+3));
for(i=1;i<=n;i++)
{
update(i,1);
scanf("%d",&a[i]);
}
for(i=n;i>=1;i--)
{
a[i]=Find(i-a[i],n);
update(a[i],-1);
}
for(i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
return 0;
}
hdu2852代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e5+6;
int tree[maxn],cnt[maxn],lowbit[maxn];
void GetLowbit()
{
for(int i=1;i<maxn;i++)
lowbit[i]=i&-i;
}
void update(int x,int v)
{
for(int i=x;i<maxn && i;i+=lowbit[i])
tree[i]+=v;
}
int query(int x)
{
int ret(0);
for(int i=x;i>0;i-=lowbit[i])
ret+=tree[i];
return ret;
}
int Find(int a,int k)
{
int down=a+1,mid,up=maxn-1,c=query(a),v,ret=1e9;
while(down<=up)
{
mid=(down+up)>>1;
v=query(mid)-c;
if(v>=k)
{
up=mid-1;
if(ret>mid)
ret=mid;
}
else
down=mid+1;
}
return ret;
}
int main()
{
GetLowbit();
int q,a,k,tp,v;
while(scanf("%d",&q)!=EOF)
{
memset(tree,0,sizeof(tree));
memset(cnt,0,sizeof(cnt));
while(q--)
{
scanf("%d",&tp);
if(tp==0)
{
scanf("%d",&v);
cnt[v]++;
update(v,1);
}
else if(tp==1)
{
scanf("%d",&v);
if(cnt[v]>0)
{
cnt[v]--;
update(v,-1);
}
else
puts("No Elment!");
}
else
{
scanf("%d%d",&a,&k);
int num=query(maxn-1)-query(a);
if(num<k)
puts("Not Find!");
else
printf("%d\n",Find(a,k));
}
}
}
return 0;
}
树状数组求第K小值 (spoj227 Ordering the Soldiers && hdu2852 KiKi's K-Number)的更多相关文章
- UVA11525 Permutation[康托展开 树状数组求第k小值]
UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...
- 树状数组求第k小的元素
int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
- hdu 4217 Data Structure? 树状数组求第K小
Data Structure? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- poj 2985 The k-th Largest Group 树状数组求第K大
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8353 Accepted ...
- HDU 5249 离线树状数组求第k大+离散化
KPI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ...
- POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)
树状数组求逆序对 转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...
- Ultra-QuickSort(树状数组求逆序对数)
Ultra-QuickSort 题目链接:http://poj.org/problem?id=2299 Time Limit: 7000MS Memory Limit: 65536K Total ...
随机推荐
- Windows内核读书笔记——SEH结构化异常处理
SEH是对windows系统中的异常分发和处理机制的总称,其实现分布在很多不同的模块中. SEH提供了终结处理和异常处理两种功能. 终结处理保证终结处理块中的程序一定会被执行 __try { //要保 ...
- (转)粒子编辑器Particle designer属性的介绍
转载:http://blog.csdn.net/ym19860303/article/details/9210539 Particle designer粒子编辑器可到这里下载(包含授权码):http: ...
- Hadoop案例(一)之日志清洗
日志清洗案例 一. 简单解析版 1)需求 去除日志中字段长度小于等于11的日志. 2)输入数据 /Sep/::: +] "-" "Mozilla/4.0 (compati ...
- SGU 205. Quantization Problem
205. Quantization Problem time limit per test: 0.25 sec. memory limit per test: 65536 KB input: stan ...
- Three.js基础探寻六——文字形状与自定义形状
1.文字形状 说起3d文字想起了早年word里的一些艺术字: 时间真快. 那么TextGeometry可以用来创建三维的文字形状. 使用文字形状需要下载和引用额外的字体库.这里,我们以 helveti ...
- 字符串处理strcpy strcat函数的用法
C语言函数字符串处理strcpy strcat函数的用法: 1)strcat是用来连接两个字符串的,原型是char *strcat(char *dest,char *src),作用是把src所指字符串 ...
- thinkjs项目中使用mongoose需要注意的地方
原文链接thinkjs项目中使用mongoose需要注意的地方 由于thinkjs不支持mongodb的关联模型查询,所以我不得不使用mongoose这个第三方odm. 我有两个选择,一是像我在exp ...
- HDU5883 The Best Path(欧拉回路 | 通路下求XOR的最大值)
本文链接:http://www.cnblogs.com/Ash-ly/p/5932748.html 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=588 ...
- Python并发编程-守护进程
守护进程 子进程转换为守护进程 主进程的代码结束,子进程的代码也应该接收, 这个事情有守护进程来做 守护进程会随着主进程的代码执行完毕而结束, 而不是随着主进程的接收而结束(子进程不一定结束) fro ...
- [BZOJ3583]杰杰的女性朋友(矩阵快速幂)
杰杰的女性朋友 时间限制:10s 空间限制:256MB 题目描述 杰杰是魔法界的一名传奇人物.他对魔法具有深刻的洞察力,惊人的领悟力,以及令人叹为观止的创造力.自从他从事魔法竞赛以来,短短几 ...