摘要:
根据奇偶性,把x,y坐标加起来是奇数的位置翻转一下,就变成求最大01子矩阵了。 然后预处理出每个位置往上最长的01路径,每行用一个单调栈解决。 单调栈从栈底到栈顶维护每一个矩阵的高度和宽度,按高度递增维护。 当前高度如果小于栈顶的高度,那就将栈顶的矩阵更新答案,并且出栈,但是它的宽度是可以为当前高度 阅读全文
摘要:
基环森林上DP。 我刚开始想的就是找到环,然后把环上每个点及它的子树缩成一个点,就变成一个环上的DP了。然后就是强制第一个不取和强制最后一个不取。 看了别人的题解发现可以不用那么麻烦,只要找到环上任意相邻的两点,强制把这条边断开,然后还是DP两次就行了。 DP方程就比较naive了。 #includ 阅读全文
摘要:
平移、旋转、放缩对两个相似三角形没有影响,那么一个长度为 $n$ 的轨迹就可以描述为 $n-2$ 个三角形,每个三角形就用相邻两边长来描述,还得加上第二条线段在第一条线段的逆时针还是顺时针方向,因为如果不加这个就会出现翻不翻转带来的影响,然后就变成了字符串匹配了。不过由于字符集很大,得用 map 来 阅读全文
摘要:
能看到其他所有点的区域就是轮廓线的半平面交。 然后最小高度就是半平面交与轮廓线这两个一次分段函数的差,极值肯定出现在分段点上,分别求一下即可。 #include <bits/stdc++.h> #define db double const db eps = 1e-9; inline int sig 阅读全文
摘要:
$dp[i][j][k][l]$ 表示 $i$ 个男生,$j$ 个女生,结尾段男生最多比女生多 $k$ 个,女生最多比男生多 $l$ 个。 $dp[i + 1][j][k + 1][\max\{l - 1, 0\}]$ $+=$ $dp[i][j][k][l]$ $dp[i][j+1][\max\{ 阅读全文
摘要:
感觉我双指针不行啊...写了个multiset过的。看了别人代码改了发双指针。 写几个样例大概就知道跟田忌赛马一样了。 #include <bits/stdc++.h> const int N = 1e5 + 7; int a[N], b[N]; std::multiset<int> st1, st 阅读全文