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

posted @ 2019-09-09 23:05  HTWX  阅读(147)  评论(0编辑  收藏  举报