CF1483 解题报告

比赛地址

这场蒟蒻只能打 div2 ,打出了一堆下饭操作(

A. Prison Break

给出一个 \(n\le m\) 的网格图,问你最少删掉多少条边才能使得任意格子联通且和外面联通, \(t\) 组数据。

\(t,n,m\le 100\)

显然的结论题,答案是 \(n\le m\) ,问就是每次删一个边连通块最多减一。

code

B. Restore Modulo

给出一个序列 \(\{a\}\) ,要你判断是否存在 \(c,p\) 满足对于任意 \(i\) ,有 \(a_i=(a_{i-1}+c) \mod p\) ,是则输出 \(c,p\)\(c\) 最小。

\(n\le 10^5 , a_i\le 10^9\)

显然有 \(c<p\) ,所以前后的差只能是是 \(c\)\(c-p\) ,找出这两个差后算出 \(c,p\) ,最后再扫一遍判断。

然后这个玩意我竟然打了 10+min (

code

C. Basic Diplomacy

\(n\) 个朋友,你要玩 \(m\) 天,每天可以找的朋友是一个集合,每个朋友最多找 \(⌈\frac{m}{2}⌉\) 次,构造方案。

\(n,m\le 10^5\)

就硬贪,每天的集合直接按大小从小到大排序,然后每次能加就加。

似乎因为每个朋友最多找 \(⌈\frac{m}{2}⌉\) 次,所以这个贪心是对的?

code

D. Playlist

给出一个序列 \(\{a\}\) ,从 \(1\) 开始遍历,遍历方式是一个环,找到两个相邻数的满足互质就删掉后面一个,问删掉的数的顺序。

\(n\le 10^5\)

按题意模拟即可,先遍历一遍将满足互质的存入队列里,每次删完后看是否出现新的互质的相邻数,加入队尾,可以用链表维护位置。

然后这个下饭人在打完后贡献了一发罚时又调了 10+min (

code

E. Skyline Photo

\(n\) 个建筑,高度为 \(h_i\) ,美丽度为 \(w_i\) ,你要划分成许多段,每段的贡献为高度最小的美丽度,求最大贡献。

\(n\le3\times 10^5 , 1\le h_i\le 10^9 , -10^9\le w_i\le 10^9\)

套路题,显然有 \(dp_i\) 为前 \(i\) 个建筑的最大贡献。

\[dp_i=\max_{j=1}^{i-1} dp_{j-1} + val(j,i) \]

注意到这个 \(val(j,i)\) 对应的高度是随着 \(j\) 的减小而单调降的,这启发我们用单调栈解决。

然后用单调栈维护每一块的最大的 \(dp_{j-1}\) 和一个前缀 \(\max\) ,就可以做到 \(\mathcal{O(n)}\) 转移了。

这个下饭人由于维护成了 \(dp_j\) 搞了半个小时才 AC (

code

F. Useful Edges

给出一个 \(n\) 个点 \(m\) 条边的无向图和 \(q\) 个形如 \(u\)\(v\) 的路径长度不超过 \(w\) 的限制,只要一条边满足存在一条路径包含这条边且满足某一条限制就会一个贡献,问最终贡献。

\(2\le n\le 600 , 1\le m,q\le \frac{n(n-1)}{2}\)

我有一个奇怪的做法,先用 Floyed 跑出两两的最短路,显然对于一个限制 \((u,v,w)\) ,对于一个 \(x\)\((u,x,w-dis(x,v))\)\((x,v,w-dis(u,x))\) 也是一个限制。

然后将 \(q\) 个限制放入数组中跑 Floyed ,然后对于每条边判断,复杂度 \(\mathcal{O(n^3)}\)

我不太懂这个为啥是对的,毕竟 Floyed 是从小扩展到大的,这个却反了过来。

这个下饭人由于前面的下饭操作+跑去洗了个澡错失了 AK div2 的机会(

code

G. Vabank

一开始你有一块钱,每次你可以询问一个 \(x\) ,如果大于 \(M\) 你就扣 \(x\) 元,否则加 \(x\) 元,要你在 \(105\) 次询问中找出 \(M\) ,如果你被扣到了负数就输了。

\(M\le 10^{14}\)

先考虑一个垃圾的 \(3\log M\) 做法。

假设你现在有 \(2^i\) 块,你可以询问 \(2^i\) ,成功你就变到 \(2^{i+1}\) 块,否则成穷光蛋。

利用上面方法可以在 \(1\log M\) 询问次数得到 \(M\)\([2^k,2^{k+1})\) 中,此时你是个穷光蛋。

然后询问两次 \(2^k\) 将钱提到 \(2^{k+1}\) 块,开始二分。

设区间为 \([L,R)\) ,你有至少 \(R\) 块钱,每次询问 \(L+(R-L)/2\) ,成功则得到 \(L+(R-L)/2\) 块,区间变为 \([L+(R-L)/2,R)\) ,否则失去 \(L+(R-L)/2\) ,区间变为 \([L,L+(R-L)/2)\) ,此时还剩 \((R-L)/2\) 块,再补一个 \(L\) 即可继续二分,最劣可达 \(2\log M\) 次。

然后在上面做法上改一改比例,调一下参数就可以过了?

code

H. Exam

给出 \(n\) 个字符串,求二元组 \((i,j)\) 的个数,满足 \(s_j\)\(s_i\) 的子串,且不存在一个 \(k\) 满足 \(s_k\)\(s_i\) 的子串且 \(s_j\)\(s_k\) 的子串,当然 \(i,j,k\) 互不相等。

\(n\le 10^6 , \sum |s_i| \le 10^6\)

比较套路的串串题,然而我降智了以为这个关系是个树(

先建 AC 自动机,然后对于每个点维护 fail 树祖先中最近的一个整串编号,也就是每个点代表的串的最长后缀整串编号。

对每个串将所有前缀的维护的东西拿出来,显然找出的编号满足充分性,然后考虑将这些整串在这个串上处于那些位置。

如果存在一个前缀维护的整串将前面的一个前缀的整串给整个覆盖了,那么被覆盖的那个整串是不会和当前串产生贡献的。

将串丢入 fail 树中,用树状数组维护即可,复杂度 \(\mathcal{O(n\log n)}\)

code

posted @ 2021-03-26 09:59  Dabuliuzp  阅读(172)  评论(0编辑  收藏  举报
/* */ 返回顶端