HDU 5372 Segment Game

我的内心是几乎崩溃的,感受到了英语渣的悲剧。。

前几次WA没有发现是第i次增加操作。> <

发现的时候已经要结束了,飞快的改完一看来不及了直接一交。。。愉快领到了CE,已得赛后秒过题综合症。

其实这题看起来像CDQ分治,但是我还不太会= =

但是我们可以用树状数组做。

先来个图

当查询[x,y]这个区间的时候。蓝色的是需要统计的,绿色的是不需要统计的。橙色的 另外说。

可以用left[i]表示左端点在i的右边的(>=)的点的个数。

right[i]表示右端点在i的右边的点的个数。(>)

可以发现绿色的线段有个统一的特点:他们的左端点统计在left[x]中,右端点统计在right[y]中。

蓝色的线段只有出现在left[x]中。

这样,我们用left[x] - right[y]就能获得蓝色线条的个数了。

当时纠结了很久橙色线条也出现在了right[y]中,该怎么去掉。。。然后突然发现线段长度递增,因此不会出现前面的线段比后面的长的情况,也就不会出现前面有长度大于i的线条,也就是根本没有这个橙色线条存在。。

于是这道题就变水了。。。

直接用一个树状数组维护左端点在1-x中有多少个,另一个维护右端点在1-x有多少个

查询的时候加加减减就好了。。。

T T 居然没过T T居然还是因为看错题T T不想愉快玩耍了T T

好好学英语T T

重新培养一下变量定义的习惯T T

代码是队友的,就不贴啦> <

时间: 2024-12-29 05:09:38

HDU 5372 Segment Game的相关文章

hdu 5372 Segment Game(树状数组)

题目链接:hdu 5372 Segment Game 因为线段长度是递增的,不会出现后面的线段被前面的线段完全覆盖,所以只要分别计算[1,l-1]之间有多少个左端点,[1,r]之间有多少个右端点,想减即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 2 * 1e5 + 5; #define lowbit(x) ((x)&a

当前插入的线段能完整覆盖存在的几条线段 树状数组 HDU 5372 Segment Game

http://acm.hdu.edu.cn/showproblem.php? pid=5372 Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1284    Accepted Submission(s): 375 Problem Description Lillian is a clever girl so

hdu 5372 Segment Game(树状数组+离散化)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5372 题意:有两种操作,输入a b,①a==0,插入第i条线段[b,b+i],输出[b,b+i]内有多少条完全包含于[b,b+i]的线段②a==1,删除插入的第b条线段. 分析:由于插入的线段长度是递增的,那么就不存在包含[b,b+i]的线段.那么完全包含于[b,b+i]的线段的数目=右端点小于等于b+i的线段的数目-左端点小于b的线段的数目.由于输入的数比较大,离散化一下就行了. 代码: #inclu

HDU 5372 Segment Game 树状数组

链接 Segment Game Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 273    Accepted Submission(s): 48 Problem Description Lillian is a clever girl so that she has lots of fans and often receives gi

hdu 5372 Segment Game 【 树状数组 】

给出一些操作, 0是将第i次增加的线段放在b位置,第i次放的线段的长度为i 1是将第b次增加操作放的线段删除 每次增加操作完之后,询问这条线段上面的完整的线段的条数 每次询问统计比这条线段左端点大的线段的条数 L,比这条线段右端点大的线段的条数 R,两个相减就是完整的线段的条数 另外因为给的b很大,所以需要离散化一下,而且b可能会相同,所以相同大小的应该占据一个编号 然后就像求逆序对那样的算 1 #include<iostream> 2 #include<cstdio> 3 #in

HDU 5372 Segment Game(线段树+离散化)

题意: 有两种操作: 1. 插入一个线段 2. 删除一个已存在的线段 每次插入后输出当前插入的线段能完整覆盖存在的几条线段. 解析: 线段树上面维护的是两个值,左端点的和,右端点的和 每次插入一条区间[L, R]就, 先询问 [0, R] 的右端点个数 lsum 再询问[L, INF]的左端点的个数 rsum tot表示:当前线段还有几条 那么题目要求的是整条线段的个数就是:lsum+rsum?tot (这里用到了容斥的思想) 再用线段树(或者树状数组)单点增加左节点的个数,和右节点的个数 删除

HDU 5372 Segment Game (MUT#7 树状数组+离散化)

[题目链接]:click here~~ [题目大意]: 题意:两种操作,添加线段和删除线段,第i次添加时告诉线段起点并且要添加长度为i的线段,删除第i次添加的线段,问每次添加后有多少线段是落在当前要画的线段内部的. [思路]:比赛的时候居然直接无视了这道题,赛后看了一下,感觉要用到树状数组,有一种前后互相影响的样子,昨天想了一下午,加上昨天晚上,总算是搞明白了,因为每次画的线段的长度是递增的,所以当前画的线段不可能被其他线段包含,那么统计小于左端点的点的个数x和小于等于右端点的点的个数y,两者之

HDU - 5666 Segment (大数位运算)好题

HDU - 5666 Segment Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description Silen August does not like to talk with others.She like to find some interesting problems. Today she finds an interesting problem

HDU 1558 Segment set (并查集+线段非规范相交)

题目链接 题意 : 如果两个线段相交就属于同一集合,查询某条线段所属集合有多少线段,输出. 思路 : 先判断与其他线段是否相交,然后合并. 1 //1558 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <cmath> 6 #define eps 1e-8 7 #define zero(x) (((x) > 0 ? (x) : (-x)) < e