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$数列,已知每个数前面比他小的数个数,试确定该序列. 相当的一道水题.可以发现数列最后一个数是首先可以确定下来的.然后把 ...
 
随机推荐
- 不要写很酷但同事看不懂的Java代码
			
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.为了提高 Java 编程的技艺,我最近在 GitHub 上学习一些高手编写的代码.下面这一行代码(出自大牛之手)据说可以征服你的朋 ...
 - 002-DOM事件实例-实现一个可以拖拽的登陆窗口
			
前言:这是跟着慕课网一个老师的视频做的,这几天在重新的梳理自己,写完这个例子要系统的学一下jQuery,我司现在用的还是比较多,毕竟用了它不用考虑IE兼容性,可以让开发更有效率. 1.项目需求及基本的 ...
 - vue.js 中使用(...)运算符报错
			
今天在起别人项目的时候, 发现报错. 这个错误是,项目中不识别es6的扩展运算符, 解决方式很简单. // 第一步 cnpm install babel-plugin-transform-object ...
 - cordova+vue打包ios调用相机闪退解决
			
cordova+vue项目打包android,打开相机正常使用,但是打包ios后,需要多几个配置,才能打开,否则当调用的时候会闪退,上配置图 需要在选中的文件里面添加 <key>NSCam ...
 - Spring Boot 2.x基础教程:使用MyBatis的XML配置方式
			
上一篇我们介绍了如何在Spring Boot中整合我们国人最常用的MyBatis来实现对关系型数据库的访问.但是上一篇中使用了注解方式来实现,而对于很多MyBatis老用户还是习惯于XML的开发方式, ...
 - 测试后的iview的表格
			
<template> <GPage bg> <div> <div class="table"> ...
 - NSInteger打印以及字符串的转换
			
You can also use %zd (NSInteger) and %tu (NSUInteger) when logging to the console. NSInteger integer ...
 - 教妹学Java:Spring 入门篇
			
你好呀,我是沉默王二,一个和黄家驹一样身高,刘德华一样颜值的程序员(管你信不信呢).从两位偶像的年纪上,你就可以断定我的码龄至少在 10 年以上,但实话实说,我一直坚信自己只有 18 岁,因为我有一颗 ...
 - 第三篇:Linux的基本操作与文件管理(纯命令行模式下)(下)
			
接上篇介绍完软件的管理(查询.删除.安装)之后,本篇将介绍Linux的文件和目录的管理. 如何浏览Linux的目录(文件夹),就像Windows一样,我们平时需要打开各个目录,去里面找一找曾经悄悄存储 ...
 - 【原创】(求锤得锤的故事)Redis锁从面试连环炮聊到神仙打架。
			
这是why技术的第38篇原创文章 又到了一周一次的分享时间啦,老规矩,还是先荒腔走板的聊聊生活. 有上面的图是读大学的时候,一次自行车骑行途中队友抓拍的我的照片.拍照的地方,名字叫做牛背山,一个名字很 ...