poj 2182 Lost Cows 解题报告

题意:每个奶牛都有一个编号,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Keras的多标签图像分类

原文链接&#xff1a;https://www.pyimagesearch.com/2018/05/07/multi-label-classification-with-keras/ 作者&#xff1a;Adrian Rosebrock 今天介绍的是基于 Keras 实现多标签图像分类&#xff0c;主要分为四个部分&#xff1a; 介绍采用的多标签数据集简单介绍使用的网…

快速入门 Jupyter notebook

2019 年第 64 篇文章&#xff0c;总第 88 篇文章本文大约 6400 字&#xff0c;阅读大约需要 17 分钟原文链接&#xff1a;https://www.dataquest.io/blog/jupyter-notebook-tutorial/Jupyter notebook 是一个很强大的交互式和展示数据科学项目的工具&#xff0c;它可以作为一个…

简单ORACLE分区表、分区索引

一段听说CSDN.COM里面很多好东西&#xff0c;同事建议看看合适自己也可以写一写&#xff0c;呵呵&#xff0c;今天第一次开通博客&#xff0c;随便写点东西&#xff0c;就以第一印象分区表简单写第一个吧。 ORACLE对于分区表方式其实就是将表分段存储&#xff0c;一般普通表格是…

【进程】进程通信-信号方式(中断)

信号方式(中断) 信号的基本概念 每个信号都对应一个正整数常量(称为signal number,即信号编号。定义在系统头文件<signal.h>中)&#xff0c;代表同一用户的诸进程之间传送事先约定的信息的类型&#xff0c;用于通知某进程发生了某异常事件。每个进程在运行时&#xff0c…

Jupyter notebook 入门教程

原文链接&#xff1a;https://www.dataquest.io/blog/jupyter-notebook-tutorial/ Jupyter notebook 是一个很强大的交互式和展示数据科学项目的工具&#xff0c;它可以作为一个开发文档&#xff0c;包含代码、解释说明文字、代码运行结果、数学公式等等&#xff0c;功能非常强…

【图像分类】细粒度图像分类是什么,有什么方法,发展的怎么样

欢迎大家来自《图像分类》专栏&#xff0c;今天讲述细粒度图像分类问题&#xff0c;这是计算机视觉领域一项极具挑战的研究课题&#xff0c;本文介绍了细粒度图像分类算法的发展现状、相关数据集和竞赛&#xff0c;供大家参考学习。作者 | 郭冰洋编辑 | 言有三1 简介细粒度图像…

Jupyter 进阶教程

2019 年第 65 篇文章&#xff0c;总第 89 篇文章本文大约 7500 字&#xff0c;建议收藏阅读原题 | Tutorial: Advanced Jupyter Notebooks作者 | Benjamin Pryke译者 | kbsc13("算法猿的成长"公众号作者)原文 | https://www.dataquest.io/blog/advanced-jupyter-note…

Jupyter进阶教程

原题 | Tutorial: Advanced Jupyter Notebooks 作者 | Benjamin Pryke 译者 | kbsc13("算法猿的成长"公众号作者) 原文 | https://www.dataquest.io/blog/advanced-jupyter-notebooks-tutorial/ 声明 | 翻译是出于交流学习的目的&#xff0c;欢迎转载&#xff0c…

jQuery Mobile高手必备的十大技巧和代码片段

本文转自51ito布加迪编译版本: http://mobile.51cto.com/hot-276160.htm 其中未发现英文原作链接&#xff0c;为尊重版权&#xff0c;google之后附上: http://www.webdesignerdepot.com/2011/05/10-handy-jquery-mobile-tips-and-snippets-to-get-you-started/ jQuery Mobile高…

PyTorch 系列 | 数据加载和预处理教程

图片来源&#xff1a;Unsplash&#xff0c;作者&#xff1a;Damiano Baschiera2019 年第 66 篇文章&#xff0c;总第 90 篇文章本文大约 8000 字&#xff0c;建议收藏阅读原题 | DATA LOADING AND PROCESSING TUTORIAL作者 | Sasank Chilamkurthy译者 | kbsc13("算法猿的成…

PyTorch系列 | 如何加快你的模型训练速度呢?

图片来源&#xff1a;Pixabay&#xff0c;作者&#xff1a;talha khalil2019 年第 67 篇文章&#xff0c;总第 91 篇文章本文大约 6500 字&#xff0c;建议收藏阅读&#xff01;原题 | Speed Up your Algorithms Part 1 — PyTorch作者 | Puneet Grover译者 | kbsc13("算法…