Codeforces Round #581 (Div. 2)
继续闲的没事,就又补了一场cf
不过没开vp...(这样就可以随便提交而不用担心fst了
打到一半还被叫出去打球了hhh
(还是打球有意思
A和B都挺水的,随便暴力就好了
C题挺有意思的
题意是:
给出一个有向无权图(n<100),图中不存在自环(说到自环就又想起上午尴尬的计网hhh),给出一个长度为m的序列a,保证a_i和a_i+1之间存在从a_i指向a_i+1的边,显然,这个序列是一条路径(m<1e6)
你需要从这个序列中得到一个最短的子序列b,每次从b_i到b_i+1都选择两点之间的最短路,这样同样得到一条路径,要求该路径和a序列表示的路径一致
看到n<100就先敲了一个Floyd,但是敲着敲着觉得可能用不上,感觉可以直接判断,如果a_i-1与a_i+1不存在一条直接的边,a_i就可以被去掉,然后大胆交了一发(反正也不掉rating
果然WA了
稍微想一下就会发现,这个做法是有问题的(废话!
因为他给的路径会有环,如果单纯的判断,就有可能把环跳过去
再想一下,这个题目给的条件还是有说法的
实际上a_i到a_j的路径长度就是j-i
那么就自然想到记录一下上一个没有被删去的点的下标last,做一下Floyd,然后满足d[a[last]][a[i]]+d[a[i]][a[i+1]] = d[a[last]][a[i+1]]的点就都可以被删掉了
然后就过了
D题就更有意思了
题意是:
给出一个01序列a,你需要给出一个新的01序列b,使得对于任意的i和j
a_i~a_j之间的最长不下降子序列长度和b_i~b_j之间的最长不下降子序列长度一致
同时要求b序列中1的个数尽可能少
这个题有两个版本,区别就是a的长度不同
直接看hard版本 n<1e5
乍一看这个题目像是要做个dp什么的,再加上贪心求一个最长不下降子序列之类的,O(n+nlogn)看起来还是蛮合理的
但是问题在于我不大会做
不如来一些奇思妙想
首先在a序列中"10"这个子串肯定是不能变的
显然(?)a序列中的0也是不用变的
试着脑补证明,剩下的1都可以改成0
感觉没什么问题
交一下
没有过样例
...
试着再找一些规则...
就想到了这个
如果一个子串p是不能变的
那么这个p前面有一个1,后面有一个0,那么这个拓展的子串1p0也是不能变的
这样的话,剩下的可以改变的就是以一堆0为前缀,一堆1为后缀的串了
那么这样的话,把1变成0,是不会改变结果的
思考一下要怎么实现
似乎一个栈就好了
写了一发
就过了hhh