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/

 

以上。

 

posted @ 2017-03-28 12:54  Strork  阅读(525)  评论(0编辑  收藏  举报