混进杭二训练——Day5

废话

今天居然水了个不错的排名?

但是坑点也不少,不然应该还可以往前水水qwq

坑点嘛,比如,评测用了subtask。。。

正题

T1

【题目大意】

有一张 n n n个点 m m m条边的图,有 k k k个操作,每次在之前的基础上删除一条边,每次删除后需要你输出这张图相对于原图,其中有多少个点到1的最短距离发生了改变。

【样例输入】

5 6 5
1 2
1 3
4 2
3 2
2 5
5 3
5
2
4
1
3

【样例输出】

0
2
2
4
4

【数据规模】

1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105
1 ≤ m ≤ 2 × 1 0 5 1 \leq m \leq 2 \times 10^5 1m2×105
1 ≤ k ≤ m 1 \leq k \leq m 1km

【题解】

很神奇,我的做法又跟题解不一样,但是ZZY和我的搞法是类似的。

最短路嘛,首先想到用SPFA来搞,发现SPFA不支持删边,于是考虑将删边看为加边,操作反着来即可。一开始构图的时候先不加删掉的边,然后跑SPFA,然后反着一条一条边加进去,每加一条边后,看这条边连着的两个点谁离1更近,然后把·11更近的点放到栈里面跑一次SPFA即可。如果都走不到1,那么就不跑SPFA。

很优秀,但是subtask4T掉了 1 3 \frac 1 3 31的点,于是整个subtask的分都没了,最后只捞到60分。(贼气

这个做法可以优化,但是我没想到会T,所以没写优化。

可惜的是ZZY想到了优化,但是深搜写挂了qwq

优化是这样的:如果这条边连接的两个点中有一个到1的距离已经是最短的了,那么就把这个点放到栈里面跑SPFA,如果不是没有点的距离是最短的,那么下面也必定不能将别的点更新成最短的,那么答案就不会变化,所以此时就不用做。

T2

【题目大意】

有一个字符串序列,由P、O、I三种字符构成,现在要你再插入一个字符(P或O或 I),使得这个序列中包含尽可能多的’POI‘字序列,问最多能包含几个?

【样例输入】

5
POIOI

【样例输出】

6

【数据规模】

n ≤ 1 0 7 n \leq 10^7 n107

【题解】

大水题。

P只可能放在最前面,I只可能放在最后面,然后O考虑放中间,放在某一个位置的贡献是前面的P的数量乘后面的I的数量,这些情况里面取个最大值即可。

这道题简直是魔鬼,最后一个subtask的最后一个点会爆long long,要用高精度,导致我直接没了20分。

T3

【题目大意】

有n个石头,每个石头有 a a a b b b两个属性,假如相邻的两块石头的 a a a属性的 gcd ⁡ \gcd gcd大于 1 1 1,那么这两块石头可以抵消掉并产生两块石头b属性的和的贡献,现在问能产生的最大贡献是?

【样例输入】

6
9 11
8 19
6 12
5 17
6 18
3 15

【样例输出】

64

【数据规模】

1 ≤ n ≤ 6000 1 \leq n \leq 6000 1n6000
1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109
1 ≤ b i ≤ 1 0 6 1 \leq b_i \leq 10^6 1bi106

对于 n ≥ 800 n \geq 800 n800的数据,有这样一个性质:
在这里插入图片描述

【题解】

显然可以写出一个 n 3 n^3 n3 d p dp dp,定义 f [ i ] [ j ] = t r u e f[i][j]=true f[i][j]=true表示 i i i~ j j j区间可以全部抵消。

但是 d p dp dp对于 n ≥ 800 n \geq 800 n800的数据会超时,于是我们考虑从大到小枚举 l l l,对于满足 f [ l + 1 ] [ r − 1 ] = t r u e f[l+1][r-1]=true f[l+1][r1]=true gcd ⁡ ( a l , a r ) > 1 \gcd(a_l,a_r)>1 gcd(al,ar)>1 r r r,从 l l l连一条边到 r r r,然后从每个左端点出发dfs一遍就能得到答案。

说实话我也没看懂特殊性质,所以不知道为什么这个做法的时间复杂度是 O ( c × n 2 × l o g ( n ) + n 2 ) O(c \times n^2 \times log(n)+n^2) O(c×n2×log(n)+n2)的,只能坑着了。


今天前两题挺容易,但是第三题的性质真的很迷。。

下午讲了个扫描线,学过,不难。

临走前看到了李建老师的奖状之类的东西,辅导指导老师,真的是很厉害。

明天最后一场,希望有个好成绩!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值