废话
今天并没有什么废话。
正题
感觉模拟赛好像更简单了?(一定是我变强了qwq
T1
【题目大意】
有一根白色绳子, m m m次操作,每次将绳子上 l l l~ r r r的部分染成黑色,然后输出此时绳子上有多少个黑色连续段。
【样例输入】
5
1 2
4 5
2 4
6 8
4 6
【样例输出】
1
2
1
2
1
【数据范围】
1
≤
m
≤
2
×
1
0
5
1 \leq m \leq 2 \times 10^5
1≤m≤2×105
1
≤
l
,
r
≤
1
0
9
1 \leq l,r \leq 10^9
1≤l,r≤109
【题解】
我居然发现了比题解还优秀的搞法!(可惜考场上空间开小了RE4个点只拿到60分
先说题解的做法。
用一棵平衡树维护线段,以线段的左端点为关键字。每次加入新的线段的时候,二分查找这个线段应该插入在哪里,插进去,扫一下左端点在这个线段内的线段,然后合并即可。
因为每条线段只会被合并一次,所以是 O ( n l o g n ) O(nlogn) O(nlogn)的。
我的做法思路和他差不多是一样的,但是我用并查集来维护。
有木有发现这题跟校门外的树有点类似?
于是可以用类似的搞法,每次暴力将区间 [ l , r ] [l,r] [l,r]的 f a fa fa都改成 r r r,遇到黑色的点就直接往他的 f a fa fa那里跳即可。
时间是线性的,比他少一个log。
by the way,ZZY有一个线段树的搞法,不晓得他有没有写进博客里
T2
【题目大意】
有n个点,给出他们在数轴上的坐标(
a
1
a_1
a1~
a
n
a_n
an),现在有m个操作,每个操作有两种。
- 将第x个点的坐标改成y
- 给出x,y,要你求 ∑ x ≤ a i ≤ a j ≤ y ( a j − a i ) \sum _{x\leq a_i \leq a_j \leq y} (a_j-a_i) ∑x≤ai≤aj≤y(aj−ai)
【样例输入】
5
-1 -10 -5 7 7
5
1 2 -5
2 -3 10
1 3 3
2 3 10
1 3 6
【样例输出】
16
8
【数据规模】
1 ≤ n , m ≤ 1 0 5 1 \leq n,m \leq 10^5 1≤n,m≤105
− 1 0 9 ≤ a i ≤ 1 0 9 -10^9 \leq a_i \leq 10^9 −109≤ai≤109
【题解】
考场上想到了搞法然而时间不够了qaq
正确性显然可以保证,所以就懒得贴出题人的题解了,这里给出我的做法。
先考虑询问。
显然这个询问是可以拆开的,对于一段有 k k k个点的区间,假如某个点的前面有 x x x个点,后面有 k − x − 1 k-x-1 k−x−1个点,那么这个点的坐标会被加x次,被减 k − x − 1 k-x-1 k−x−1次,所以它最终对答案的贡献就是 x − ( k − x − 1 ) x-(k-x-1) x−(k−x−1)乘上自己的坐标。
为了方便,我们这里称 x − ( k − x − 1 ) x-(k-x-1) x−(k−x−1)为这个点的权值。
仔细观察发现,这个权值是有规律的。
举个例子:
假如有一段5个点的区间,那么每个点的权值是这样的:
− 4 , − 2 , 0 , 2 , 4 -4,-2,0,2,4 −4,−2,0,2,4
另一颗栗子,假如有一段6个点的区间:
− 5 , − 3 , − 1 , 1 , 3 , 5 -5,-3,-1,1,3,5 −5,−3,−1,1,3,5
发现规律了吗?
相邻的权值之间都差2!
于是可以考虑维护这样一个东西:
因为每次是对坐标轴中的一段进行操作,所以我们将这些点放到坐标轴里面,这样每次操作时这些点就是有序的,这个坐标轴可以用一个动态开点线段树来维护。
然后考虑维护一个序列,第一个点的值为它的坐标乘 1 1 1,第二个点的值为它的坐标乘 3 3 3,……,第n个点的值为它的坐标乘 2 n − 1 2n-1 2n−1(注意这里的第一个点第二个点不是指输入的那个顺序,而是指在数轴上从左往右的第一个点第二个点),这样我们就得到了一个权值满足上述规律的序列。
然后再维护一个二号序列,这个序列仅仅存每个点的坐标即可。
那么现在把它投入到实战中!
假如有一个5个点的询问,那么他需要的是这样一个权值的序列:
− 4 , − 2 , 0 , 2 , 4 -4,-2,0,2,4 −4,−2,0,2,4
现在我们拥有一个这样权值的序列:
p + 1 , p + 3 , p + 5 , p + 7 , p + 9 p+1,p+3,p+5,p+7,p+9 p+1,p+3,p+5,p+7,p+9
那么显然,让我们拥有的这个序列减去(二号序列对应部分乘 ( p + 5 ) (p+5) (p+5)),就能得到他需要的序列。
很优秀!时间 O ( n l o g n ) O(nlogn) O(nlogn)!
接下来考虑修改。
将一个点的坐标从x改到y,我们只需要对序列中坐标在 [ x , y ] [x,y] [x,y]之间的点做修改即可。修改就是让序列中的点减去(或加上)两倍二号序列中对应点的值。
于是。。我在考场上没打完修改。。(难受555……
T3
【题目大意】
有n个人,每个人有一个能力值和默契值,然后不知道为什么这些人要分队伍,现在有m个询问,每次给你两个人,这两个家伙想在同一个队伍里,问这两个人在同一个队伍的情况下这支队伍最多能有几个人。如果不能在同一个队伍则输出-1。
一支队伍合法的条件:这支队伍有一个队长,他的能力值是最大的,而且要满足 队伍中任意一个人和队长的默契值的差的绝对值不超过k。
输入格式:n,k,一行能力值a,一行默契值p,m,m个询问。
【样例输入】
5 1
2 2 2 1 2
5 1 5 2 1
5
1 4
1 2
5 2
4 5
1 3
样例输出
-1
-1
3
3
2
【数据规模】
2
≤
n
≤
1
0
5
2 \leq n \leq 10^5
2≤n≤105
0
≤
m
≤
1
0
5
0 \leq m \leq 10^5
0≤m≤105
0
≤
k
,
a
i
,
p
i
≤
1
0
9
0 \leq k,a_i,p_i \leq 10^9
0≤k,ai,pi≤109
【题解】
实话我当时甚至没想过这题= =,时间不够丫
这里就把出题人给的题解给出来好了。
我就懒得抄了,直接把他的题解贴出来:
他写的挺好的,至少不难懂。
这里做一些详细的解释:
首先是如何求以i为组长时的组员人数。
将每个点以纵坐标排序后从纵坐标小的开始一个一个插入到图中,线段树维护横坐标,记录每个横坐标上有多少个点,每次插入一个坐标为x的点时,他的组员人数就是 [ x − k , x + k ] [x-k,x+k] [x−k,x+k]这一段的点的个数,然后再线段树上将x这个位置+1。
我们设以i为组长时组员人数为 s u m i sum_i sumi
其次是对于每个询问,它给出两个点,如何求组长的坐标范围。
因为组长的能力值比他们都大,所以组长的纵坐标比他们都大。
我们设这两个点中在左边的点的横坐标为x,在右边的点的横坐标为y,那么组长的横坐标范围就是 [ y − k , x + k ] [y-k,x+k] [y−k,x+k],如果 y − k y-k y−k大于 x + k x+k x+k,那么就是无解。
最后我们得到了一个个新的询问:给出一个坐标范围,问这个范围内的点中 s u m i sum_i sumi最大的那个点的 s u m i sum_i sumi是多少。
我们可以将询问的纵坐标从大到小排序,然后将所有点也按纵坐标从大到小过一遍,同样是用一棵线段树来维护横坐标,这次维护横坐标为x的点中 s u m i sum_i sumi最大的那个点的 s u m i sum_i sumi是多少,然后每次遇到一个询问的纵坐标时,将这个询问对应的横坐标区间在线段树中取个最大值即可。
下午讲了个网络流的最大权闭合子图,学过的,不难。然后问题大了,居然讲了个单纯形法,这个东西我预习的时候没搞懂,听完之后依然不懂,现在和ZZY肝了几个小时依然不懂!这个应该只能回去请教师兄了。。(原谅我咕在这里了
晚上去吃了肯德基,果然那里的汉堡是要比麦当劳的汉堡要好吃的!(麦当劳的汉堡,图片中高度等于直径,实际上高度还没有半径大。。)点可乐的时候,猛地想起LJY的名言——可乐为什么要加冰?它总不能直接加水吧。
于是赶紧点了个不加冰的可乐。
看来明天的模拟赛能水一个不错的成绩丫!