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/

以上。

时间: 2024-08-26 21:22:24

P1243~P1247 线段树模板题总结的相关文章

[POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]

可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <vector> using namespace std; int n,q,tot,a[110000]; in

LA 2191电位计(线段树模板题)

线段树模板题,没啥好说的.....注意输出是case之间空一行就行.........之前一直没注意,一直wa 代码如下: #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #includ

1270. 数列区间最大值(climits用法+线段树模板题)

题目链接: https://www.acwing.com/problem/content/1272/ 题解: 线段树模板题,单点求和.区间查询都可 AC代码: #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <climits> using namespace std; const int N = 1e5+10; int a

HDU 1166 线段树模板题

坐了3天的火车,终于到外婆家了(┬_┬).这次北京之旅颇有感触,虽然学到的东西不是很多(主要是自己的原因,没有认真学,并不是老师讲的不好),不过出去见见世面也是好的.最后一场比赛印象颇深,被虐的有点惨....记得当时有道题感觉自己能过,想用数组模拟链表水过,可是无论怎么优化一直超时@[email protected]后面比完后听朋友说那题应该用线段树做,顿时恍然大悟,然并卵,线段树的模板早忘了.....今天做道线段树的模板题先复习一下,过会再想想那道题. 敌兵布阵 Time Limit: 200

poj2823 线段树模板题 点修改(也可以用单调队列)

这道题吧 没计算时间 因为给了那么多 一算还可以 就直接写了线段树,刘汝佳那本模板 然后!poj的g++比C++慢大约500ms.......g++tle,C++就过了 Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 67576   Accepted: 19163 Case Time Limit: 5000MS Description An array of size n ≤ 106 is

权值线段树模板题

array Time Limit: 1500ms Memory Limit: 256M Description You are given an array . Initially, each element of the array is unique.Moreover, there are  instructions. Each instruction is in one of the following two formats: 1. ,indicating to change the v

HDU1754 线段树模板题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 题目分析:对于给出的一个很长的区间,对其进行单点更新值和区间求最大值的操作,由于查询的区间很大,且查询次数多,这里用线段树求解将是十分合适的 注意点:1.对于存放线段树的数组大小需要开大一些 2.对于c语言的字符输入%c之前需要加一个空格保证输入准确 1 #include<iostream> 2 #include<string.h> 3 using namespace std;

[bzoj1568]李超线段树模板题(标志永久化)

题意:要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第i条被插入的线段的标号为i. 2.给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. 解题关键:注意标志的作用 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cmath> 6 #include<iostrea

又长又臭又慢的线段树 模板题hdu1698 Just a Hook

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 30901    Accepted Submission(s): 15221Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing f