• P1243~P1247 线段树模板题总结


    前言

      这几天刚刚刷了5道线段树(水)题,现在来总结一下。

      首先是犯的不少错误:

        1.建树、更新函数没有return。这是最气的,每次最后程序错误查了半天也没查出来,最后发现是没有return。递归边界要return,递归边界要return,递归边界要return,重要的事情说三遍。

        2.判断查找区间于线段的变量写反。听说这个是常犯错误。

      然后说一下学线段树的收获。线段树的代码量的确多,很能练自己的思维,而且学的过程中简单的理解了一下#define的用处。线段树用来解决区间查询,区间修改都很方便,而且复杂度是log n级别,比单纯暴力快很多。而且用递归的线段树也很好理解,并且有助于理解二叉树的结构【strork这个弱鸡很懒,并没有看过二叉树】。

    题目

      首先P1243 P1244没什么说的,一个点修改一个区间修改,纯模板题。

      至于P1245售票系统:

        

    描述 Description	
     	某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路局规定售出的车票只
    能是坐票, 即车上所有的旅客都有座。售票系统是由计算机执行的,每一个售票申请包含三个参数,分别
    用O、D、N表示,O为起始站,D为目的地站,N为车票张数。售票 系统对该售票申请作出受理或不受理的
    决定,只有在从O到D的区段内列车上都有N个或N个以上的空座位时该售票申请才被受理。请你写一个程序,
    实现这个自动售票系统。 输入格式 Input Format 第一行包含三个用空格隔开的整数C、S和R,其中1≤C≤60000, l≤S≤60000,1≤R≤60000。
    C为城市个数,S为列车上的座位数,R为所有售票申请总数。接下来的R行每行为一个售票申请,用三个
    由空格隔开的整数O,D和N表示,O为起始站,D 为目的地站,N为车票张数,其中1≤D≤C,1≤O≤C,所有的
    售票申请按申请的时间从早到晚给出。 输出格式 Output Format 输出共有R行,每行输出一个“YES”或“NO”,表示当前的售票申请被受理或不被受理。 样例输入 Sample Input 4 6 4 1 4 2 1 3 2 2 4 3 1 2 3 样例输出 Sample Output YES YES NO NO 时间限制 Time Limitation 1s

       这道题也很好思考,对每个数据先updata然后search,如果返回的值大于座位数,那么就把刚刚的票取消,即updata的偏移量,记录值为负数

        x=ax;
        y=ay-1;
        updatait(1,n,1);
        int ans=findit(1,n,1);
        if(ans<=s) cout<<"YES"<<endl;
        else{
            cout<<"NO"<<endl;
            t=-t;
            updatait(1,n,1);
        }   

      至于P1246,刚开始我像P1245一样做的,然而问题是这个相当于每个座位数并不固定。

    描述 Description	
     	Farmer John最近新建立了一个农场,并且正在接受奶牛的畜栏分配请求,有些
    畜栏会看到农场美妙的风景。:)
    
    农场由N (1 <= N <= 100,000) 个畜栏组成,编号为1..N,畜栏i可以最多容纳C_i只奶牛
    (1 <= C_i <= 100,000)。奶牛i希望得到连续的一段畜栏,表示为一段区间 (A_i,B_i) 。
    这样的话奶牛可以在这段牛棚里面转悠。(当然,这段畜栏必须要有足够的空间)
    
    给出M (1 <= M <= 100,000) 个请求,请求出不超过畜栏承载量的情况下,最多可以满足的请求数。
    
    考虑下面展示的一个农场:
    
    【在下面】
    
    FJ 不能够同时满足4头奶牛的请求,否则3,4号畜栏就会有太多的奶牛。
    
    考虑到奶牛2的请求需要一个区间包含3号和4号畜栏,我们尝试这样一种方案,让1,3,4号奶牛
    的请求都得到满足,这样没有畜栏超出容量的限制,因此,对于上述情况的答案就是3,三头奶牛
    (1,3,4号)的要求可以得到满足。
    
    输入格式 Input Format	
     	第1行:两个用空格隔开的整数:N和M
    
    * 第2行到N+1行:第i+1行表示一个整数C_i
    
    * 第N+2到N+M+1行: 第i+N+1行表示2个整数 A_i和B_i
    
    输出格式 Output Format	
     	* 第一行: 一个整数表示最多能够被满足的要求数
    样例输入 Sample Input	
     	
    5 4
    1
    3
    2
    1
    3
    1 3
    2 5
    2 3
    4 5
    
    样例输出 Sample Output	
     	
    3
    时间限制 Time Limitation	
     	1s
    

      

      解决思路可以反着来:先建树,然后要这头牛就将区间--;

      注意的是需要提前预处理,将奶牛按照右端点升序排列,如果右端点相等排左端点,然后一只一只往里放;

      》》》》》》》》》P1247 贪婪大陆  请参考山神dydxh的博客:     链接:http://dydxh1998.blog.163.com/blog/static/2382091122015231141472/

    以上。

  • 相关阅读:
    POJ 2892 Tunnel Warfare(树状数组+二分)
    POJ 2886 Who Gets the Most Candies?(树状数组+二分)
    POJ 2492 A Bug's Life(并查集)
    POJ 1182 食物链(并查集)
    POJ 1703 Find them, Catch them(种类并查集)
    TC SRM 582 DIV 2
    函数
    shell进阶--流程
    计划任务 at,cron
    kill命令
  • 原文地址:https://www.cnblogs.com/snifemoree/p/6633808.html
Copyright © 2020-2023  润新知