agc021 题解

link

code

A

贪心,后面全放九,放不了就减一。

B

不会计算几何,紧急学凸包。

显然只有在凸包上的点答案可能不是 0,因此先把这些点求出来。

那么一个点所占据的角度就是和相邻两个点的中垂线所形成的角,这个可以轻松算。

注意共线的时候要特殊判一下。

C

首先可以观察到如果 n,m 中有奇数,说明最后一行只能放横的,最后一列只能放竖的。

放完之后,剩下的地方直接贪心放,感觉挺对的。

然后 WA 了,不知道哪里图了,所以看了题解。

如果数据是 3 3 2 2,可以构造出答案是:

<>^
^.v
v<>

所以右下角需要特判一下即可。

前面贪心放为什么是对的呢?考虑每个 2×2 为一组,每组中放两个横的或者竖的,这样最后如果分别剩下一个就用上面那个构造,否则无解。

D

简单题,最后的公共子序列在原串中一定是一个回文子序列,因此直接区间 dp 即可。

E

依然考虑去对应,对于一个 RB 方案,先考虑 n=1 的情况,如果 R>B,那么必定合法,R<B 必定不合法,R=B 的情况比较阴间,不太会。

考虑还需要去满足 n1 个其他的,那么考虑让一个东西合法最优秀的方案就是给一个 R 以及它后面的一个 B,这样 RB 不变。

如果这样的东西全部取完了,把 R 想象成左括号,B 是右括号,那么显然是前面全是 B,后面全是 R

如果还有没满足的,那么就只能直接给一个 R 去满足。

这样放完后,剩下的全部给第一个即可。

但是此时第一个吃的球可能 R=B,非常难以判断,因此看题解

如果 R=B 且合法,说明最后一个一定是 B,直接令 B1,这样满足 R>B,一定合法。

因此只要强制第一个一定是 R>B 的,数方案数即可。

枚举一下 R 放即可,卡特兰数算一下就好了。

F

这个题就相对简单了。

依然考虑去对应,对于一种 A,B,C,将所有能涂黑的全部都涂黑,然后数方案。

相当于每一列选了一个区间,然后每一行要选择一个点,不能是区间端点,只需要考虑 dp 顺序即可,是从上往下还是从左往右。

从左往右 dp,这样会确定一些行已经选过了点,然后再不断确定新的点。

fi,j 表示已经有了 i 列,其中有 j 行已经选过点的方案数,然后考虑去加一行。

如果加一行不选点,那么考虑区间就可以乱选,系数是 1+j+(j2)

否则需要选,比如 fi,j 去转移 fi+1,k,相当于 k 个里面选择 j 个表示已经选过的东西,然后又要选一个区间包含所有没选过的东西的方案。

x=kj,y=j,也就是说直接插板,然后 y 的最左边和最右边两端要各选一个点来放区间。

这是经典套路,直接多两个球,多两个板即可,最后得到 (x+y+2x+2)=(k+2j)

转移方程就是

fi,j=(1+j+(j2))fi1,j+k<jfi1,k(j+2k)

NTT 一下,复杂度 O(nmlogn)

posted @   houzhiyuan  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示
主题色彩