POJ2182 Lost Cows 题解
POJ2182 Lost Cows 题解
题目
有\(N\)(\(2 <= N <= 8,000\))头母牛,每头母牛有自己的独一无二编号(\(1..N\)).
现在\(N\)头母牛站成一列,已知每头母牛前面编号比它小的母牛数量,求每头母牛的编号.
输入格式
第1行 : 一个整数 \(N\)
第2..N行 : 从 第2头母牛到第N头母牛 的 前面编号比它小的母牛数量
输入样例
5
1
2
1
0
输出样例
2
4
5
3
1
题解
先手造一组数据
2 1 5 4 3 // 编号序列
设比第\(i\)头牛前面比它编号小的牛的数量为\(A_i\),编号为\(B_i\)
可以发现,最后一头牛编号为3,前面有2头编号比它小的牛.因为所有编号比它小的点都在前面,所以,\(B_N=A_N+1\)
同理,对于倒数第二头牛
- 若\(A_{N-1}<A_N\),则\(B_{N-1}=A_{N-1}+1\),唯一在它后面的第\(N\)头牛编号比它大,所以所有编号比它小的点都在前面,例如 :
3 4 2 1 5 // 编号序列
因为\(0=A_4<A_5=4\),则\(B_4=A_4+1=0+1=1\)
- 若\(A_{N-1}>A_N\),则\(B_{N-1}=A_{N-1}+2\),相比第一条,最后一头牛编号也比它小,额外加上1,例如 :
3 4 2 5 1 // 编号序列
因为\(3=A_4>A_5=0\),则\(B_4=A_4+2=3+2=5\)
因为第i头牛前面有\(A_i\)头牛编号比它小,所以\(B_i\)至少是\(A_i+1\)(也就是从第\(1\)到第\(i-1\)头牛都在这头牛的前面的情况),如果后面的牛还有比它小的,那么这头牛的编号又要增加,所以\(B_i\)为\(1..N\)中去掉\(B_{i+1}\)..\(B_N\)中的数 后 从前往后的第\(A_i+1\)个数
建立一个长度为\(N\)的数组c,初始化为\(1\)
因为要去掉后面的数,所以从后往前扫描\(A_i\),对于每个\(A_i\),查询该数组中第\(A_i+1\)个"1"的位置,此位置的下标就是\(B_i\),然后\(c[B_i]=0\),这是在去掉\(B_{i+1}\)..\(B_N\)中的数
使用样例数据模拟一遍
0 1 2 1 0 // A序列(省略A[0])
开始扫描
1 1 1 1 1 // c数组(省略c[0])
第一次 : \(A_5=0\),第\(0+1\)个"1"的下标为\(1\),则\(B_5=1\)
[0]1 1 1 1 // c数组(省略c[0])
第二次 : \(A_4=1\),第\(1+1\)个"1"的下标为\(3\),则\(B_4=3\)
0 1[0]1 1 // c数组(省略c[0])
第三次 : \(A_3=2\),第\(2+1\)个"1"的下标为\(5\),则\(B_3=5\)
0 1 0 1[0] // c数组(省略c[0])
第四次 : \(A_2=3\),第\(3+1\)个"1"的下标为\(4\),则\(B_2=4\)
0 1 0[0]0 // c数组(省略c[0])
第五次 : \(A_1=0\),第\(0+1\)个"1"的下标为\(2\),则\(B_1=2\)
将B数组顺序输出出来即可
至于怎么求第\(A_i+1\)个"1",就需要使用树状数组维护c数组的前缀和,每次查询时使用二分
代码
// Memory :704 KB
// Time :94 MS
// Code Length :965 B
#include <cstdio>
#include <iostream>
#define lowbit(x) ((x)&(-x))
using namespace std;
const int N = 8005;
int n, a[N], c[N], h[N];
void add(int x) {
while (x <= n) {
c[x]--;
x += lowbit(x);
}
}
int ask(int x) {
int ans = 0;
while (x) {
ans += c[x];
x -= lowbit(x);
}
return ans;
}
int main() {
scanf("%d",&n);
for (int i = 1; i <= n; i++) {
// 初始化树状数组
c[i]++;
if (i + lowbit(i) <= n) c[i + lowbit(i)] += c[i];
}
a[1] = 1; // 本来为0,提前加1
for (int i = 2; i <= n; i++) {
scanf("%d", &a[i]);
a[i]++; //提前加1
}
for (int i = n; i; i--) {
// 二分
int l = 1, r = n;
while (l < r) {
int mid = (l + r) >> 1;
if (ask(mid) < a[i]) l = mid + 1;
else r = mid;
}
// 记录答案,并更新树状数组
add(h[i] = l);
}
for (int i = 1; i <= n; i++) printf("%d\n", h[i]);
return 0;
}
POJ2182 Lost Cows 题解的更多相关文章
- [poj2182] Lost Cows (线段树)
线段树 Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacula ...
- [BZOJ 1652][USACO 06FEB]Treats for the Cows 题解(区间DP)
[BZOJ 1652][USACO 06FEB]Treats for the Cows Description FJ has purchased N (1 <= N <= 2000) yu ...
- POJ2182 Lost Cows
题意 Language:Default Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13448 Accep ...
- poj2186 Popular Cows 题解——S.B.S.
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29642 Accepted: 11996 De ...
- Poj2182 Lost Cows(玄学算法)
题面 Poj 题解 不难发现最后一位就是\(pre[n]+1\),然后消除这个位置对其他位置的贡献,从左到右扫一遍,必定有至少一个位置可以得出,循环这个过程,\(O(n^2)\)出解. #includ ...
- 洛谷 SP740 TRT - Treats for the Cows 题解
SP740 TRT - Treats for the Cows 题目描述 FJ has purchased N (1 <= N <= 2000) yummy treats for the ...
- 洛谷 P2858 [USACO06FEB]奶牛零食Treats for the Cows 题解
P2858 [USACO06FEB]奶牛零食Treats for the Cows 题目描述 FJ has purchased N (1 <= N <= 2000) yummy treat ...
- 洛谷 P3088 [USACO13NOV]挤奶牛Crowded Cows 题解
P3088 [USACO13NOV]挤奶牛Crowded Cows 题目描述 Farmer John's N cows (1 <= N <= 50,000) are grazing alo ...
- poj2182 Lost Cows[BIT二分]
blog题解鸽了许久了..本来说好的切一题写一个题解的说 一个$1 \sim n$数列,已知每个数前面比他小的数个数,试确定该序列. 相当的一道水题.可以发现数列最后一个数是首先可以确定下来的.然后把 ...
随机推荐
- 弹性盒子Flex Box滚动条原理,避免被撑开,永不失效
在HTML中,要实现区域内容的滚动,只需要设定好元素的宽度和高度,然后设置CSS属性overflow 为auto或者scroll: 在Flex box布局中,有时我们内容的宽度和高度是可变的,无法 ...
- 前端每日实战:8# 视频演示如何用纯 CSS 创作一个充电 loader 特效
效果预览 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/deNqdV 可交互视频教程 此视频是可以交 ...
- JAVA Integer值的范围
原文出处:http://hi.baidu.com/eduask%C9%BD%C8%AA/blog/item/227bf4d81c71ebf538012f53.html package com.test ...
- 初窥Mybatis初始化
引言 这篇文章呢,主要是讲Mybtais的两种方式的源码剖析:传统方式以及Mapper代理方式,初次探索Mybatis源码,希望大佬勿喷并且指正错误,谢谢! 个人博客:www.fqcoder.cn 一 ...
- Everything-快速找到你的文件,电脑前的你值得拥有
如果你也是一位电脑使用者,那么你可以考虑下载这个"Everything". Everything是一款非常非常强大的软件.相信不少电脑用户,特别是Windows用户,都尝试使用过W ...
- Java基础篇(02):特殊的String类,和相关扩展API
本文源码:GitHub·点这里 || GitEE·点这里 一.String类简介 1.基础简介 字符串是一个特殊的数据类型,属于引用类型.String类在Java中使用关键字final修饰,所以这个类 ...
- 关于Java序列化的问题你真的会吗?
引言 在持久化数据对象的时候我们很少使用Java序列化,而是使用数据库等方式来实现.但是在我看来,Java 序列化是一个很重要的内容,序列化不仅可以保存对象到磁盘进行持久化,还可以通过网络传输.在平时 ...
- 关于js拖放功能的实现
这是具体的拖放代码的HTML,里面依赖两个组件:EventUtil.js是兼容浏览器添加方法的库,EventTarget.js是一个发布-订阅者模式的对象库. EventUtil.js: var Ev ...
- HDFS NameNode详解
1. namenode介绍 namenode管理文件系统的命名空间.它维护着文件系统树及整棵树内所有的文件和目录.这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件fsimage和编辑日志文 ...
- ApplicationContextInitializer的理解和使用
一.ApplicationContextInitializer 介绍 1.1 作用 ApplicationContextInitializer 接口用于在 Spring 容器刷新之前执行的一个回调函数 ...