题目: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 &amp;&amp; hdu2852 KiKi&#39;s K-Number)的更多相关文章

  1. UVA11525 Permutation[康托展开 树状数组求第k小值]

    UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...

  2. 树状数组求第k小的元素

    int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ...

  3. POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8807   Accepted ...

  4. hdu 4217 Data Structure? 树状数组求第K小

    Data Structure? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. poj 2985 The k-th Largest Group 树状数组求第K大

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8353   Accepted ...

  6. HDU 5249 离线树状数组求第k大+离散化

    KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  8. POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)

    树状数组求逆序对   转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...

  9. Ultra-QuickSort(树状数组求逆序对数)

    Ultra-QuickSort 题目链接:http://poj.org/problem?id=2299 Time Limit: 7000MS   Memory Limit: 65536K Total ...

随机推荐

  1. /bin、/sbin、/usr/bin、/usr/sbin目录Linux执行文档的区别

    /bin./sbin./usr/bin./usr/sbin目录的区别   在linux下我们经常用到的四个应用程序的目录是/bin./sbin./usr/bin./usr/sbin .而四者存放的文件 ...

  2. xcode7 安装 KSImageNamed

    1.前往Xcode7的插件文件夹,路径如下: ~/Library/Developer/Xcode/Plug-ins 如果有KSImageNamed,右键删除 2.在终端直接输入命令行: default ...

  3. mysql的两种存储引擎

    MySQL 有多种存储引擎,目前常用的是 MyISAM 和 InnoDB 这两个引擎,除了这两个引擎以为还有许多其他引擎,有官方的,也有一些公司自己研发的.这篇文章主要简单概述一下常用常见的 MySQ ...

  4. Pandas DataFrame构造简析

    参考书籍:<利用Python进行数据分析> DataFrame简介: DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值.字符串.布尔值等).Dat ...

  5. MYSQL-----控制流程函数(case when...then..else..end)

    MySQL有一些内置的控制流程函数,可以在SQL语句中使用这些函数来更加准确和直接的结果. 第一种语法: case when [value] then result ................. ...

  6. [原创] 基于RDP的桌面广播

    之前写过一篇使用C# UDP 组播技术做的桌面广播实现, C# 使用UDP组播实现局域网桌面共享.最终效果差强人意,UDP包在不同的交换机上发送还会出现发送失败的情况,所以又重新研究了一些新的方法,包 ...

  7. 【LOJ】#2010. 「SCOI2015」小凸解密码

    题解 断环为链,把链复制两份 用set维护一下全是0的区间,然后查找x + n / 2附近的区间,附近各一个过不去,最后弃疗了改为查附近的两个,然后过掉了= = 熟练掌握stl的应用,你值得拥有(雾 ...

  8. Redis实战(四)

    配置好了web.config程序,并且能通过C#代码来读取和管理以上配置信息. 接下来,就可以进行Redis的数据写入了.Redis中可以用Store和StoreAll分别保存单条和多条数据,C#中具 ...

  9. img标签src图片地址找不到显示默认图片

    可以采用onerror的属性: onerror="javascript:this.src='${base}/after/img/aifu.png'" <img id=&quo ...

  10. python中if和elif的区别

    多个if语句是每次单独判断 比如: 例子一: a = 5 if a < 6: #条件1 print(1) if a < 7: #条件2 print(2) else: print(3) 条件 ...