混进杭二训练——Day3

废话

今天并没有什么废话。

正题

感觉模拟赛好像更简单了?(一定是我变强了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 1m2×105
1 ≤ l , r ≤ 1 0 9 1 \leq l,r \leq 10^9 1l,r109

【题解】

我居然发现了比题解还优秀的搞法!(可惜考场上空间开小了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个操作,每个操作有两种。

  1. 将第x个点的坐标改成y
  2. 给出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) xaiajy(ajai)

【样例输入】

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 1n,m105

− 1 0 9 ≤ a i ≤ 1 0 9 -10^9 \leq a_i \leq 10^9 109ai109

【题解】

考场上想到了搞法然而时间不够了qaq

正确性显然可以保证,所以就懒得贴出题人的题解了,这里给出我的做法。

先考虑询问。

显然这个询问是可以拆开的,对于一段有 k k k个点的区间,假如某个点的前面有 x x x个点,后面有 k − x − 1 k-x-1 kx1个点,那么这个点的坐标会被加x次,被减 k − x − 1 k-x-1 kx1次,所以它最终对答案的贡献就是 x − ( k − x − 1 ) x-(k-x-1) x(kx1)乘上自己的坐标。

为了方便,我们这里称 x − ( k − x − 1 ) x-(k-x-1) x(kx1)为这个点的权值。

仔细观察发现,这个权值是有规律的。

举个例子:

假如有一段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 2n1(注意这里的第一个点第二个点不是指输入的那个顺序,而是指在数轴上从左往右的第一个点第二个点),这样我们就得到了一个权值满足上述规律的序列。

然后再维护一个二号序列,这个序列仅仅存每个点的坐标即可。

那么现在把它投入到实战中!

假如有一个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 2n105
0 ≤ m ≤ 1 0 5 0 \leq m \leq 10^5 0m105
0 ≤ k , a i , p i ≤ 1 0 9 0 \leq k,a_i,p_i \leq 10^9 0k,ai,pi109

【题解】

实话我当时甚至没想过这题= =,时间不够丫

这里就把出题人给的题解给出来好了。

我就懒得抄了,直接把他的题解贴出来:
在这里插入图片描述
他写的挺好的,至少不难懂。

这里做一些详细的解释:

首先是如何求以i为组长时的组员人数。

将每个点以纵坐标排序后从纵坐标小的开始一个一个插入到图中,线段树维护横坐标,记录每个横坐标上有多少个点,每次插入一个坐标为x的点时,他的组员人数就是 [ x − k , x + k ] [x-k,x+k] [xk,x+k]这一段的点的个数,然后再线段树上将x这个位置+1。

我们设以i为组长时组员人数为 s u m i sum_i sumi

其次是对于每个询问,它给出两个点,如何求组长的坐标范围。

因为组长的能力值比他们都大,所以组长的纵坐标比他们都大。

我们设这两个点中在左边的点的横坐标为x,在右边的点的横坐标为y,那么组长的横坐标范围就是 [ y − k , x + k ] [y-k,x+k] [yk,x+k],如果 y − k y-k yk大于 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的名言——可乐为什么要加冰?它总不能直接加水吧。于是赶紧点了个不加冰的可乐。

看来明天的模拟赛能水一个不错的成绩丫!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值