摘要:
做法一:直接dinic跑 做法二:平面图最小割转对偶图最短路,左下外区域为起点,右上外区域为终点,一条边连接两个区域,把区域看成点,就变成了最短路问题。 #include <bits/stdc++.h> namespace IO { char buf[1 << 21], buf2[1 << 21], 阅读全文
摘要:
最小左转法将平面图转成对偶图,然后扫描线进行点定位。 上述两种算法可看这篇博客 这个图可能存在一个轮廓包含另一个轮廓的情况,那么就把左上角的点连个线就可以了,实现也是用扫描线。 自己看懂了算法代码还是不会写,计算几何过于薄弱。。。可作为板子好好巩固。。。 #include <bits/stdc++. 阅读全文
摘要:
就是二分图匹配,直接匈牙利即可。 #include <bits/stdc++.h> const int N = 220; bool used[N]; int hascow[N], n, link[N][N]; bool find(int x) { for (int i = 1; i <= n; i+ 阅读全文
摘要:
刚开始想手写平衡树来着,但是发现其实没必要,因为插入操作很友好。 对每个位置维护一个初始位置的值以及末尾位置的值,插入之前和当前位置的末尾值差一下加入set,和下一个位置的初始位置的值差一下加入set,删去当前末尾值与下一位置初始值的差即可。 另外一个也用一个set维护。 #include <bit 阅读全文
摘要:
根据奇偶性,把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 阅读全文