题意:给出数n, 代表有多少头牛, 这些牛的编号为1~n, 再给出含有n-1个数的序列, 每个序列的数 ai 代表前面还有多少头比 ai 编号要小的牛, 叫你根据上述信息还原出原始的牛的编号序列

分析:如果倒着看这个序列的话, 那序列的最后一个元素就能够确定一个编号。举个例子:如果序列的最后一个元素为0, 那就说明这头牛前面再也没有比它编号更小的牛了, 所以这头牛的编号肯定是最大的, 我们只要给它所在的编号加个标记, 然后继续根据倒数第二个、第三个……来依次确定便可还原整个序列, 这里可以使用树状数组做, 初始化全部加1操作, 然后开始枚举编号, 看哪个编号前面是有多少比其编号小的牛, 即区间求和, 一旦和一开始给出的序列元素相同则确定是此编号, 确定一头之后便抹去这头牛的编号, 即add(num, -1), 时时更新即可, 但是这里如果用for循环去枚举和的话未免太慢, 但也能AC, 这里考虑使用二分查找便很快了!

瞎搞:这题实际上还可以用线段树做, 做法大同小异, 但没想到的是, 这还是一个DP可以解决的题目……

树状数组:

#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<stack>
#define lowbit(i) (i&(-i))
#define LL long long
using namespace std;
];
];
int n;
inline void add(int i, int val)
{
    while(i<=n){
        c[i] += val;
        i += lowbit(i);
    }
}
int sum(int i)
{
    ;
    ){
        ans += c[i];
        i -= lowbit(i);
    }
    return ans;
}
int Bin_search(int L, int R, int key)
{
    int mid;
    while(L < R){
        mid = L + ((R-L)>>);
         < key) L = mid+;
        else R = mid;
    }
    return R;
}
int main(void)
{
    scanf("%d", &n);
    memset(c, , sizeof(c));
    stack<int> st;
    st.push();
    ; i<=n-; i++){
        int temp;
        scanf("%d", &temp);
        st.push(temp);
        add(i, );
    }
    add(n, );
    ;
    while(!st.empty()){
        int temp = st.top();
        st.pop();
        , n, temp);
        ans[top++] = num;
        add(num, -);
    }
    ; i>=; i--){
        printf("%d\n", ans[i]);
    }
    ;
}

线段树:

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
typedef struct segment
{
    int L, R, len;
}T;///线段树类型
], result[];///a储存input,result储存output
T tree[];///线段树数组
///------------------------------------
void init(int, int, int);
int query(int, int);
///------------------------------------
int main(void)
{
    std::ios::sync_with_stdio(false);///关闭同步,加快读入速度
    int n;
    cin>>n;
    a[] = ;///第一个前面不可能有比它小的数
    ; i<=n; i++){
        cin>>a[i];
    }
    init(, , n);///(root, L, R)
    ; i--){
        result[i] = query(, a[i]+);
    }
    ; i<=n; i++) cout<<result[i]<<endl;
    ;
}
///--------------------------------------------
void init(int root, int L, int R)///给线段树初始化从1~n的数据
{
    tree[root].L = L;
    tree[root].R = R;
    tree[root].len = R-L+;
    if(L == R) return ;
    init(*root, L, (L+R)/);
    init(*root+, (L+R)/+, R);
}
///--------------------------------------------
int query(int node, int aim)
{
    tree[node].len--;
    if(tree[node].L == tree[node].R) return tree[node].L;
    *node].len) , aim);
    +, aim-tree[node*].len);
}

POJ 2182 Lost Cows (树状数组 && 二分查找)的更多相关文章

  1. poj2182Lost Cows——树状数组快速查找

    题目:http://poj.org/problem?id=2182 从后往前确定,自己位置之前没有被确定的且比自己编号小的个数+1即为自己的编号: 利用树状数组快速查找,可另外开一个b数组,角标为编号 ...

  2. POJ 2481:Cows 树状数组

    Cows Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 14906   Accepted: 4941 Description ...

  3. 【POJ2182】Lost Cows 树状数组+二分

    题中给出了第 i 头牛前面有多少比它矮,如果正着分析比较难找到规律.因此,采用倒着分析的方法(最后一头牛的rank可以直接得出),对于第 i 头牛来说,它的rank值为没有被占用的rank集合中的第A ...

  4. POJ 2892 Tunnel Warfare(树状数组+二分)

    题目链接 二分求上界和下界,树状数组.注意特殊情况. #include <cstring> #include <cstdio> #include <string> ...

  5. PAT-1057 Stack (树状数组 + 二分查找)

    1057. Stack Stack is one of the most fundamental data structures, which is based on the principle of ...

  6. toj 4353 Estimation(树状数组+二分查找)

    Estimation 时间限制(普通/Java):5000MS/15000MS     运行内存限制:65536KByte总提交: 6            测试通过: 1 描述 “There are ...

  7. 树状数组+二分||线段树 HDOJ 5493 Queue

    题目传送门 题意:已知每个人的独一无二的身高以及排在他前面或者后面比他高的人数,问身高字典序最小的排法 分析:首先对身高从矮到高排序,那么可以知道每个人有多少人的身高比他高,那么取较小值(k[i], ...

  8. POJ 2182 Lost Cows 【树状数组+二分】

    题目链接:http://poj.org/problem?id=2182 Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  9. POJ 2828 Buy Tickets (线段树 or 树状数组+二分)

    题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...

随机推荐

  1. mysql——触发器——前期整理笔记00

    一.触发器 触发器是由事件来出发某个动作.这些事件包括insert语句.update语句和delete语句. 当数据库系统执行这些事件时,就会激活触发器执行相应得动作. 触发器是有insert.upd ...

  2. C语言I博客作业12

    一.我学到的内容 二.我的收获 作业链接 收获 博客第一次作业:https://www.cnblogs.com/gm12/p/11584148.html 第一次作业收获:第一次作业是我初步接触C语言的 ...

  3. 【Linux 网络编程】端口

    (1)众所周知的端口:0~1023,这些端口由IANA分配和控制它们紧密绑定用于一些服务.常用这些端口的通讯    明确表明了某些协议.例如:21端口为ftp服务端口. (2)注册端口:1024~49 ...

  4. (5.1.4)引擎管理——SSMS管理使用小技巧

    目录 [1]自带报表 [2]对象管理器详细信息 [3]日志 [4]活动监视器 [1]自带报表 无论是数据库.服务器实例.还是代理等等都可以有标准报表 [2]对象管理器详细信息 利用改方式,可以很有效的 ...

  5. Java 读取application.properties配置文件中配置

    实际开发中若需要读取配置文件application.properties中的配置,代码如下.例:读取配置文件中name属性配置值: 代码如下: import org.springframework.c ...

  6. HDU 1257 最少拦截系统 最长递增子序列

    HDU 1257 最少拦截系统 最长递增子序列 题意 这个题的意思是说给你\(n\)个数,让你找到他最长的并且递增的子序列\((LIS)\).这里和最长公共子序列一样\((LCS)\)一样,子序列只要 ...

  7. Centos7 升级php版本到php7

    一.首先查看是否有老版本 yum list installed | grep php 二.如果安装的有 yum remove php.x86_64 php-cli.x86_64 php-common. ...

  8. Java Script 基本知识点

                          JavaScript是一种基于对象和事件驱动的脚本语言,它提供了一些专有的类.对象及函数 1.基本数据类型 JavaScript提供了4种基本的数据类型用来 ...

  9. TCPcopy环境搭建

    参考文档:https://github.com/session-replay-tools/tcpcopy 辅助机器Assistant Server: 1.下载最新版本 git clone git:// ...

  10. 关于strcpy的安全函数的选择

    1)如果整个程序,在进行字符拷贝时,这个拷贝字符串的完整性,不影响整个程 序的运行,可以让其截取一部分字符串,程序继续执行.那么我们就可以选择安全 函数:strncpy_s 2)如果在进行字符串拷贝时 ...