POJ--Lost Cows (线段树)
题目:http://poj.org/problem?id=2182 http://acm.hdu.edu.cn/showproblem.php?pid=2711
题意:有N头牛,编号为1--N。 乱序排成一列,已知每头牛前面有多少头牛比它的编号小(从第二头牛开始)。
现在需要求这个序列中从前到后,每一头牛的编号。
思路:因为有N头牛,编号为1--N,最后一头牛如果前面有K头牛比它小,那么可以知道最后这头牛的编号为K+1.
当最后一头牛编号为K+1确定以后,再来看倒数第二头牛,如果这头牛前面有K1头牛比它小,那么这头牛的编号
必然是剩下N-1头牛中第(K1+1)大的。然后以此类推。。。。
最开始的线段树为:

最后一头牛前面有0个比它小,那么这是找第(0+1)大的数。为左下角的(1,1)即1.

倒数第二头牛前面有1个比它小,那么这头牛是剩下所有牛中第(1+1)大的,为(3,3)即3

倒数第三头牛前面有2个比它大,那么这头牛是剩下所有牛中第(2+1)大的,为(5,5)即5.

代码:
#include<cstdio>#include<cstring>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;const int maxn=8010;int n,arr[maxn],sum[maxn<<2];int num[maxn];void build(int l,int r,int rt){sum[rt]=r-l+1;if(l==r) return;int m=(l+r)>>1;build(lson);build(rson);}int query(int p,int l,int r,int rt){sum[rt]--;if(l==r) return l;int m=(l+r)>>1;if(p<=sum[rt<<1]) return query(p,lson);else return query(p-sum[rt<<1],rson);}int main(){while (~scanf("%d",&n)){build(1,n,1);for(int i=2;i<=n;i++) scanf("%d",&arr[i]);arr[1]=0;for(int i=n;i>0;i--)num[i]=query(arr[i]+1,1,n,1);for(int i=1;i<=n;i++)printf("%d\n",num[i]);}return 0;}
POJ--Lost Cows (线段树)的更多相关文章
- POJ 2481 Cows (线段树)
Cows 题目:http://poj.org/problem?id=2481 题意:有N头牛,每仅仅牛有一个值[S,E],假设对于牛i和牛j来说,它们的值满足以下的条件则证明牛i比牛j强壮:Si &l ...
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...
- Buy Tickets POJ - 2828 思维+线段树
Buy Tickets POJ - 2828 思维+线段树 题意 是说有n个人买票,但是呢这n个人都会去插队,问最后的队列是什么情况.插队的输入是两个数,第一个是前面有多少人,第二个是这个人的编号,最 ...
- POJ 2182 Lost Cows (线段树)
题目大意: 有 n 头牛,编号为 1 - n 乱序排成一列,现已知每头牛前面有多少头牛比它的编号小,从前往后输出每头牛的编号. 思路: 从后往前推,假如排在最后的一头牛比他编号小的数量为a,那么它的编 ...
- poj City Horizon (线段树+二分离散)
http://poj.org/problem?id=3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissi ...
- poj 3667 Hotel (线段树)
http://poj.org/problem?id=3667 Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 94 ...
- poj 3264(线段树)
http://poj.org/problem?id=3264 初学线段可以做的水题,也是线段树的基础运用.也是我的第一个线段树的题. 题意:在区间范围内的最大值减去最小值 思路:线段树记录下每个区间内 ...
- [poj2182] Lost Cows (线段树)
线段树 Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacula ...
- POJ 1177 Picture(线段树 扫描线 离散化 求矩形并面积)
题目原网址:http://poj.org/problem?id=1177 题目中文翻译: 解题思路: 总体思路: 1.沿X轴离散化建树 2.按Y值从小到大排序平行与X轴的边,然后顺序处理 如果遇到矩形 ...
- POJ 2299 Ultra-QuickSort(线段树+离散化)
题目地址:POJ 2299 这题以前用归并排序做过.线段树加上离散化也能够做.一般线段树的话会超时. 这题的数字最大到10^10次方,显然太大,可是能够利用下标,下标总共仅仅有50w.能够从数字大的開 ...
随机推荐
- JAVA API 实现hdfs文件操作
java api 实现hdfs 文件操作会出现错误提示: Permission denied: user=hp, access=WRITE, inode="/":hdfs:supe ...
- ThinkPHP5验证码不显示的原因及解决方法
其实很久之前刚学习tp5框架的时候就遇到了这个问题,解决完后一直没再出过问题,今天用以前的框架做新项目时又碰到了这个问题,这里记录一下 问题原因: 1.TP5本就存在这个bug 2.数据库连接不正常( ...
- DNF抽奖活动
活动内容: DNF用户在注册页面注册获得抽奖资格(或分享好友注册)参与抽奖,产生奖品后,活动参与用户,在活动领奖页面领取奖品,金币及点券需填写相应游戏区服.qq号等信息,并且为防止活动刷子,在领取页提 ...
- js实现各种复制功能
引用: <script src="https://clipboardjs.com//dist/clipboard.min.js"></script> 示例1 ...
- (PASS)什么是原子性和原子性操作?
什么是原子性操作呢? 下面我举一个例子来说明一下: A想要从自己的帐户中转1000块钱到B的帐户里.那么从A开始转帐,到转帐结束的这一个过程,称之为一个事务.在这个事务里,要做如下操作: 1. 从A的 ...
- Tools: CGAL 安装指南
环境:Microsoft Win7 SP1 Visual Studio 2015 SP3 参考: https://blog.csdn.net/milkpku/article/details/50241 ...
- js 数组 常用方法
let arr=[{a:1},{a:2},{a:3}];//forEach 数组循环// 返回void arr.forEach(i=>{ // i为arr中的元素 }) //filter 数组过 ...
- Android Android Studio 如何导出 Jar 给 Unity 使用
大致步骤如下: 1.创建新的 Android Studio 工程 2.为此 Android Studio 工程创建 Android Library 类库(也就是一个 Module)(后面就是用它生成 ...
- C/C++ 无法解析的外部符号解决方案
{ //0 类的成员函数没有实现就调用 //1 调用没有编译生成cpp 的函数 //2 没有加载lib //3 最重要的就是有声明无实现 }
- 暑假集训test-8-30
这套题有毒,T1标程挂了,T2题面完全莫名其妙,T3没有告诉取模害我打了好久高精... A题. 统计每个数后面比它小的数的个数记作f把,操作一个数就是把它后面所有比它小的数和它的f清0,然后若是它到它 ...