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\)

同理,对于倒数第二头牛

  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\)

  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 题解的更多相关文章

  1. [poj2182] Lost Cows (线段树)

    线段树 Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacula ...

  2. [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 ...

  3. POJ2182 Lost Cows

    题意 Language:Default Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13448 Accep ...

  4. poj2186 Popular Cows 题解——S.B.S.

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29642   Accepted: 11996 De ...

  5. Poj2182 Lost Cows(玄学算法)

    题面 Poj 题解 不难发现最后一位就是\(pre[n]+1\),然后消除这个位置对其他位置的贡献,从左到右扫一遍,必定有至少一个位置可以得出,循环这个过程,\(O(n^2)\)出解. #includ ...

  6. 洛谷 SP740 TRT - Treats for the Cows 题解

    SP740 TRT - Treats for the Cows 题目描述 FJ has purchased N (1 <= N <= 2000) yummy treats for the ...

  7. 洛谷 P2858 [USACO06FEB]奶牛零食Treats for the Cows 题解

    P2858 [USACO06FEB]奶牛零食Treats for the Cows 题目描述 FJ has purchased N (1 <= N <= 2000) yummy treat ...

  8. 洛谷 P3088 [USACO13NOV]挤奶牛Crowded Cows 题解

    P3088 [USACO13NOV]挤奶牛Crowded Cows 题目描述 Farmer John's N cows (1 <= N <= 50,000) are grazing alo ...

  9. poj2182 Lost Cows[BIT二分]

    blog题解鸽了许久了..本来说好的切一题写一个题解的说 一个$1 \sim n$数列,已知每个数前面比他小的数个数,试确定该序列. 相当的一道水题.可以发现数列最后一个数是首先可以确定下来的.然后把 ...

随机推荐

  1. APPium+Python+iOS屏幕滑动方法对比

    最近在学习appium自动化,对iOS手机进行滑动操作进行总结: 1.mobile:scroll;该方法在实际使用调用时,会滚动2次.执行时间很长. 向下滚动整个屏幕driver.execute_sc ...

  2. fsLayuiPlugin联动表格使用(一)

    简单联动表格使用 点击主表格,加载副表格数据, 演示地址:http://fslayuiplugin.fallsea.com/views/linkageDatagrid/index.html 联动表格配 ...

  3. 我厌倦了 Redux,那就造个轮子 Rectx:第三集

    仓库:215566435/rectx 前言 麻烦快去我的仓库里面喷: 老子学不动了,求不要更新. 呵呵,你没想到吧,这玩意儿竟然有第三集!我靠,我自己都没想到,让我们悄悄的回顾一下前两集完全没想到,竟 ...

  4. 超详细,多图文介绍redis集群方式并搭建redis伪集群

    超详细,多图文介绍redis集群方式并搭建redis伪集群 超多图文,对新手友好度极好.敲命令的过程中,难免会敲错,但为了截好一张合适的图,一旦出现一点问题,为了好的演示效果,就要从头开始敲.且看且珍 ...

  5. 登录页面判断session退出登录清空session

    1 2 3 4 5 6 if(empty($_POST)){      $_SESSION = array();     if(isset($_COOKIE[session_name()])){    ...

  6. [android]R.class里有ID,onCreate方法里调用findViewById返回空

    在做android练习,一个新手错误,记录一下: 在练习android权威编程指南时,第5章 第二个Activity部分练习,出现标题问题,代码还原如下: protected void onCreat ...

  7. Python包的应用

    包的简介 你们听到的包,可不是女同胞疯狂喜欢的那个包,我们来看看这个是啥包 官方解释: ? 1 2 3 4 5 6 7 8 9 Packages are a way of structuring Py ...

  8. Java多线程并发03——在Java中线程是如何调度的

    在前两篇文章中,我们已经了解了关于线程的创建与常用方法等相关知识.接下来就来了解下,当你运行线程时,线程是如何调度的.关注我的公众号「Java面典」了解更多 Java 相关知识点. 多任务系统往往需要 ...

  9. POI小demo

    使用poi需要先下载相关jar包(http://download.csdn.net/detail/wangkunisok/9454545) poi-3.14-20160307.jar poi-ooxm ...

  10. 使用C#+EmguCV处理图像入门(图像读取_显示_保存)二

    上个随笔已经介绍EmguCV的一些常用库和程序安装以及环境变量的配置,这次写的是如何使用这个类库对图像进行操作. EmguCV图像处理系统组成(个人见解): 图像的基本操作: 贴个代码: using ...