题意:每个奶牛都有一个编号,1- N 从第二个牛开始给出前面比她编号小的牛的个数,问你求牛的编号序列

解题思路:线段树+ 二分查找 (多个相同的数二分边界问题需要注意) 

解题代码:

  1 #include <stdlib.h>
  2 #include <string.h>
  3 #include <stdio.h>
  4 #define MAXN 8005
  5 struct node
  6 {
  7   int left , right,mid ;
  8   int num;
  9 }tree[MAXN*4];
 10 int  L(int c)
 11 {
 12   return 2 * c;
 13 }
 14 int R(int c)
 15 {
 16   return 2 * c  + 1;
 17 }
 18 void up(int c )
 19 {
 20   tree[c].num = tree[L(c)].num + tree[R(c)].num;
 21 }
 22 void  build(int c ,int p , int v)
 23 {
 24    tree[c].left = p ;
 25    tree[c].right = v ;
 26    tree[c].mid = (p+v)/2;
 27    tree[c].num = 1;
 28    if(p == v )
 29    {
 30      return;
 31    }
 32    build(L(c),p,tree[c].mid);
 33    build(R(c),tree[c].mid + 1, v );
 34    up(c);
 35 }
 36 void update(int c , int p)
 37 {
 38    if(tree[c].left == p && tree[c].right == p )
 39    {
 40        tree[c].num = 0 ;
 41        return ;
 42    }
 43    if(p <= tree[c].mid) update(L(c),p);
 44    else update(R(c),p);
 45    up(c);
 46 }
 47 int tsum = 0 ;
 48 void getsum (int c, int p , int v )
 49 {
 50    if(p <= tree[c].left && v >= tree[c].right)
 51    {
 52      tsum += tree[c].num;
 53      return ;
 54    }
 55    if(v <= tree[c].mid) getsum (L(c),p,v);
 56    else if(p > tree[c].mid) getsum(R(c),p, v);
 57    else
 58    {
 59       getsum(L(c),p,tree[c].mid);
 60      getsum(R(c),tree[c].mid + 1, v );
 61    }
 62 }
 63 int a[MAXN];
 64 int b[MAXN];
 65 int main()
 66 {
 67    int n ;
 68    while(scanf("%d",&n) != EOF)
 69    {
 70      memset(a,0,sizeof(a));
 71      memset(b,0,sizeof(b));
 72      for(int i = 2; i <= n;i ++)
 73         scanf("%d",&a[i]);
 74      b[n] = a[n] + 1;
 75      build(1,1,n+1);
 76      update(1,b[n]);
 77      for(int i = n- 1; i >=1 ;i --)
 78      {
 79        int low = 1 , high = n;
 80        int ans ;
 81        while(low <= high)
 82        {
 83          tsum = 0 ;
 84
 85          int mid = (low + high)/2;
 86          getsum(1,1,mid);
 87          if(tsum >= a[i]+1)
 88          {
 89            ans = mid ;
 90            high = mid - 1;
 91          }
 92          else
 93             low = mid +1;
 94        }
 95      //  printf("%d\n",ans);
 96        b[i] = ans ;
 97        tsum = 0 ;
 98        getsum(1,1,ans);
 99      //  printf("%d\n",tsum);
100        update(1,b[i]);
101      }
102      for(int i = 1;i <= n; i ++)
103         printf("%d\n",b[i]);
104    }
105    return 0 ;
106 }

View Code

转载于:https://www.cnblogs.com/zyue/p/3224570.html

poj 2182 Lost Cows 解题报告相关推荐

  1. POJ 2800 垂直直方图 解题报告

    POJ 2800 垂直直方图 解题报告 编号:2800   考查点:简单计算题 思路: 用gets()读入4行数据,然后按字符统计,显示的时候有点小处理即可. 提交情况: 感觉POJ的测试数据有点骗人 ...

  2. Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)

    http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何求 ...

  3. POJ 1797 Heavy Transportation 解题报告

    分类:图论,生成树,最短路,并查集 作者:ACShiryu 时间:2011-7-28 地址:ACShiryu's Blog Heavy Transportation Time Limit: 3000M ...

  4. POJ 2977 生理周期 解题报告

    2977 : 生理周期 总时间限制: 1000ms 内存限制: 65536kB 描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高 ...

  5. POJ 1001 Exponentiation C++解题报告 JAVA解题报告

    求高精度幂 Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 126980   Accepted: 30980 Descripti ...

  6. POJ 2182 Lost Cows [树状数组+二分]

    Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular di ...

  7. poj 1325 Machine Schedule 解题报告

    题目链接:http://poj.org/problem?id=1325 题目意思:有 k 个作业,机器A有 n 个模式:0 ~ n-1,机器B 有 m 个模式:0~ m-1.每一个作业能运行在 A 的 ...

  8. 洛谷 P2862 [USACO06JAN]把牛Corral the Cows 解题报告

    P2862 [USACO06JAN]把牛Corral the Cows 题目描述 Farmer John wishes to build a corral for his cows. Being fi ...

  9. Poj 1451 JAVA 个人解题报告

    AC 时间 334ms,内存 3000k 题目大意: 模拟手机键盘的九宫格输入模式,每当输入单词,就会显示可能的单词, 根据每个单词的可能性. 这个可能性就是输入列表里跟随每个单词后面的那个正整数. ...

最新文章

  1. sync是同步还是非同步_MySQL半同步复制你可能没有注意的点
  2. 洛谷3317 SDOI2014重建(高斯消元+期望)
  3. matlab fspeical,matlab的special函数用法
  4. linux卸载mariadb数据库,CentOS yum 安装、卸载MariaDB数据库
  5. 生产Java应用程序中的十大异常类型-基于1B事件
  6. 关于MongoDB时区问题
  7. ORACLE分页查询SQL语法——高效的分页
  8. 如何实现一个简单的熔断以及Hystrix原理分析
  9. Android binder机制---概述
  10. c 语言病毒源码大全,易语言病毒源码大全
  11. VS 2017番茄插件安装破解教程:visual assist
  12. c语言实验步骤与过程,C语言实验报告《逻辑结构程序设计》
  13. 网约叫车出行小程序开发制作功能介绍
  14. 常用快捷键大全Win7快捷键
  15. 网易视频云:浅谈视频通信技术的发展
  16. C语言单目运算符和双目运算符、三目运算符
  17. 分享两个CAD模型网站
  18. linux内核态加速文件读取,学习在kernel态下使用NEON对算法进行加速的方法
  19. 骑缝章 Java_Java 在PDF中添加骑缝章示例解析
  20. 后台管理系统的逻辑实现

热门文章

  1. 【数据库的备份与还原】 .
  2. 本文将引导你使用XNA Game Studio Express一步一步地创建一个简单的游戏
  3. Tiray.SMSTiray.SMSTiray.SMSTiray.SMSTiray.SMSTiray.SMS
  4. Google-Guava-EventBus源码解读
  5. spring 之 property-placeholder 分析
  6. 关于大学生玩网络游戏的调查问卷
  7. 自定义 View 循环滚动刻度控件
  8. Redis发布与订阅——PUBLISH SUBSCRIBE
  9. openfire 的配置文件
  10. 案例精解企业级网络构建