POJ 2182 Lost Cows (求序列第k大)
题解
二分+树状数组
显然最和一个数的值就是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大)相关推荐
- 求序列第K大算法总结
参考博客:传送门 在上面的博客中介绍了求序列第K大的几种算法,感觉收益良多,其中最精巧的还是利用快速排序的思想O(n)查询的算法.仔细学习以后我将其中的几个实现了一下. 解法 1: 将乱序数组从大到小 ...
- 可持久化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 ...
- C++实现求数组中前K大的数
参考:http://blog.csdn.net/xiaoding133/article/details/8037086 C++实现求数组中前K大的数,即求数组的最大的k个数 //数组中求最大的k个数 ...
- 0206.BFPRT在一大堆数中求其前k大或前k小的问题,简称TOP-K问题(左神算法基础班源码)
package basic_class_02;/*** * 在一大堆数中求其前k大或前k小的问题,简称TOP-K问题.* 而目前解决TOP-K问题最有效的算法即是BFPRT算法**/ public c ...
- O(n)复杂度求区间第K大
O(n)复杂度求区间第K大 描述 给你一个数组,O(N)复杂度找出其中第K大的数. 输入 第一行包括两个数,N,K,分别代表数组大小,以及你应该找出第K大的数. 接下来N行,每行包括一个数. 输出 ...
- POJ 2182 Lost Cows
树状数组 + 倍增 动态维护第k大 注意倍增是 < x ,不能等于防止重复 本题从后往前扫,维护一个 01 序列,对于已经确定的排名,将他变成 0 即变成了维护第 k 大的数 用倍增结合了树状数 ...
- 整体二分求区间第k大模板(POJ 2104)
自己的模板,线段树实现的,可以参考一下 算法步骤 参考一下文章 http://www.cnblogs.com/dirge/articles/5810855.html https://www.cnblo ...
- POJ 2182 Lost Cows [树状数组+二分]
Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular di ...
- poj 2182 Lost Cows 解题报告
题意:每个奶牛都有一个编号,1- N 从第二个牛开始给出前面比她编号小的牛的个数,问你求牛的编号序列 解题思路:线段树+ 二分查找 (多个相同的数二分边界问题需要注意) 解题代码: 1 #includ ...
最新文章
- 省选专练之后缀自动机SPOJ1811LCS - Longest Common Substring
- JPA 注解的CascadeType属性
- HTML/CSS/动画
- OpenCV 中的图像处理 004_平滑图像
- 随机森林做特征重要性排序和特征选择
- android studio炸包怎么导入,请问android studio如何引入包
- LeetCode 1879. 两个数组最小的异或值之和(状态压缩DP)
- 网站免费空间和服务器的区别,网站空间和服务器的区别
- JSP 获取访问者真正的IP地址
- Git学习笔记1--Git原理简单介绍
- 洛谷2678跳石头----二分答案入门
- Day15Day16多任务和任务切换
- 《Fortran95程序设计》(彭国伦)
- 2寸的照片长宽各是多少_2寸照片的尺寸,1寸和 2 寸相片具体大小尺寸是多
- 微信小程序开发详细步骤
- python爬虫:爬取携程航班数据
- WinMTR使用教程(附图)
- 可持久化入门 ի( ‘▿ ‘ )
- 使用Unity编写传统ARPG游戏的人物操作方式
- win7计算机无法最大化,win7系统窗口老是以最大化显示且不能还原的具体方法
热门文章
- FPGA实验三——计数器的实现并用SignalTap验证
- vc6.0出现无法解析错误
- 编制一个c语言成绩记录簿_C语言学到什么程度能写推箱子
- mysql聚合函数不存在的数据_SELECT子句中不存在聚合函数时的GROUP BY行为
- java---编写一个方法,返回一个int型的二维数组,数组中的元素通过解析字符串参数获得。
- ios vue 添加本地音乐_Vue 项目一些常见问题的解决方案
- 数组元素数组中的元素通过解析字符串参数获得
- php中data(,如何使用php中的data函数
- docker安装mysql并配置,Docker安装MySql-挂载外部数据和配置
- 处理机调度实验总结_计算机系统结构总结