题解

二分+树状数组

显然最和一个数的值就是rank

那么其它数有什么规律?

从后往前匹配rank,我们可以发现第i个数的rank为还没有匹配的rank第(a[i]+1)大的数

这可以用 树状数组+二分 来求

一个数被选是0, 否则为1

显然sum(i) 表示第i个数前面有多少没被选的

二分找, 最小的i 使得 sum(i) == K

Code

#include<cstdio>
#define LL long long
#define RG registerusing namespace std;inline int gi() {RG int x = 0; RG char c = getchar(); bool f = 0;while (c != '-' && (c < '0' || c > '9')) c = getchar();if (c == '-') c = getchar(), f = 1;while (c >= '0' && c <= '9') x = x*10+c-'0', c = getchar();return f ? -x : x;
}
const int N = 80010;
int a[N], t[N], n;
#define lowbit(x) (x&(-x))
void add(int x, int k) {while (x <= n)t[x] += k, x += lowbit(x);return ;
}
inline int sum(int x) {int s = 0;while (x) s += t[x], x -= lowbit(x);return s;
}
int rank[N];
int main() {//freopen(".in", "r", stdin);//freopen(".out", "w", stdout);n = gi();for (int i = 2; i <= n; i++) a[i] = gi();for (int i = 1; i <= n; i++)add(i, 1);for (int i = n; i; i--) {int l = 1, r = n;while (l <= r) {int mid = (l + r) >> 1;if (sum(mid) >= a[i]+1)r = mid-1;else l = mid+1;}rank[i] = r+1;add(r+1, -1);}for (int i = 1; i <= n; i++)printf("%d\n", rank[i]);return 0;
}

转载于:https://www.cnblogs.com/zzy2005/p/10131280.html

POJ 2182 Lost Cows (求序列第k大)相关推荐

  1. 求序列第K大算法总结

    参考博客:传送门 在上面的博客中介绍了求序列第K大的几种算法,感觉收益良多,其中最精巧的还是利用快速排序的思想O(n)查询的算法.仔细学习以后我将其中的几个实现了一下. 解法 1: 将乱序数组从大到小 ...

  2. 可持久化Trie+堆优化 OR Trie树上求XOR第K大 ---- P5283 [十二省联考2019]异或粽子

    题目大意 题目大意: 考虑先做个 prefix xor 前缀异或bi=⨁j=1iaj(1≤i≤n)b_i=\bigoplus_{j=1}^{i}a_j(1\leq i \leq n)bi​=j=1⨁i ...

  3. C++实现求数组中前K大的数

    参考:http://blog.csdn.net/xiaoding133/article/details/8037086 C++实现求数组中前K大的数,即求数组的最大的k个数 //数组中求最大的k个数 ...

  4. 0206.BFPRT在一大堆数中求其前k大或前k小的问题,简称TOP-K问题(左神算法基础班源码)

    package basic_class_02;/*** * 在一大堆数中求其前k大或前k小的问题,简称TOP-K问题.* 而目前解决TOP-K问题最有效的算法即是BFPRT算法**/ public c ...

  5. O(n)复杂度求区间第K大

    O(n)复杂度求区间第K大 描述 给你一个数组,O(N)复杂度找出其中第K大的数. 输入 第一行包括两个数,N,K,分别代表数组大小,以及你应该找出第K大的数. 接下来N行,每行包括一个数. ​ 输出 ...

  6. POJ 2182 Lost Cows

    树状数组 + 倍增 动态维护第k大 注意倍增是 < x ,不能等于防止重复 本题从后往前扫,维护一个 01 序列,对于已经确定的排名,将他变成 0 即变成了维护第 k 大的数 用倍增结合了树状数 ...

  7. 整体二分求区间第k大模板(POJ 2104)

    自己的模板,线段树实现的,可以参考一下 算法步骤 参考一下文章 http://www.cnblogs.com/dirge/articles/5810855.html https://www.cnblo ...

  8. POJ 2182 Lost Cows [树状数组+二分]

    Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular di ...

  9. poj 2182 Lost Cows 解题报告

    题意:每个奶牛都有一个编号,1- N 从第二个牛开始给出前面比她编号小的牛的个数,问你求牛的编号序列 解题思路:线段树+ 二分查找 (多个相同的数二分边界问题需要注意) 解题代码: 1 #includ ...

最新文章

  1. 省选专练之后缀自动机SPOJ1811LCS - Longest Common Substring
  2. JPA 注解的CascadeType属性
  3. HTML/CSS/动画
  4. OpenCV 中的图像处理 004_平滑图像
  5. 随机森林做特征重要性排序和特征选择
  6. android studio炸包怎么导入,请问android studio如何引入包
  7. LeetCode 1879. 两个数组最小的异或值之和(状态压缩DP)
  8. 网站免费空间和服务器的区别,网站空间和服务器的区别
  9. JSP 获取访问者真正的IP地址
  10. Git学习笔记1--Git原理简单介绍
  11. 洛谷2678跳石头----二分答案入门
  12. Day15Day16多任务和任务切换
  13. 《Fortran95程序设计》(彭国伦)
  14. 2寸的照片长宽各是多少_2寸照片的尺寸,1寸和 2 寸相片具体大小尺寸是多
  15. 微信小程序开发详细步骤
  16. python爬虫:爬取携程航班数据
  17. WinMTR使用教程(附图)
  18. 可持久化入门 ի( ‘▿ ‘ )
  19. 使用Unity编写传统ARPG游戏的人物操作方式
  20. win7计算机无法最大化,win7系统窗口老是以最大化显示且不能还原的具体方法

热门文章

  1. FPGA实验三——计数器的实现并用SignalTap验证
  2. vc6.0出现无法解析错误
  3. 编制一个c语言成绩记录簿_C语言学到什么程度能写推箱子
  4. mysql聚合函数不存在的数据_SELECT子句中不存在聚合函数时的GROUP BY行为
  5. java---编写一个方法,返回一个int型的二维数组,数组中的元素通过解析字符串参数获得。
  6. ios vue 添加本地音乐_Vue 项目一些常见问题的解决方案
  7. 数组元素数组中的元素通过解析字符串参数获得
  8. php中data(,如何使用php中的data函数
  9. docker安装mysql并配置,Docker安装MySql-挂载外部数据和配置
  10. 处理机调度实验总结_计算机系统结构总结