随笔分类 -  BZOJ

上一页 1 ··· 3 4 5 6 7 8 下一页
摘要:整体二分加上一个二维树状数组数点即可。 #include <bits/stdc++.h> namespace IO { char buf[1 << 21], *p1 = buf, *p2 = buf; int p, p3 = -1; void read() {} inline int getc() 阅读全文
posted @ 2020-01-26 14:45 Mrzdtz220 阅读(103) 评论(0) 推荐(0)
摘要:整体二分和树套树都是 $O(n \log ^ 2 n)$ 的,但是整体二分的常数更小。 整体二分就是二分答案,然后就转化成区间数点问题,把区间里小于当前mid的数标成1,然后bit查询一下,再分成左右递归做下去。 #include <bits/stdc++.h> const int N = 5e4 阅读全文
posted @ 2020-01-26 12:31 Mrzdtz220 阅读(113) 评论(0) 推荐(0)
摘要:黑暗爆炸上没有spj。 第一部分的答案为 $\sum \limits_{j = 1}^{i - 1} q_j \times \frac{1}{(i-j)^2}$,直接卷积就行。第二部分就把 q 数组reverse一下再卷一遍。 #include <bits/stdc++.h> #define db 阅读全文
posted @ 2020-01-26 09:11 Mrzdtz220 阅读(104) 评论(0) 推荐(0)
摘要:做法一:直接dinic跑 做法二:平面图最小割转对偶图最短路,左下外区域为起点,右上外区域为终点,一条边连接两个区域,把区域看成点,就变成了最短路问题。 #include <bits/stdc++.h> namespace IO { char buf[1 << 21], buf2[1 << 21], 阅读全文
posted @ 2020-01-25 22:19 Mrzdtz220 阅读(127) 评论(0) 推荐(0)
摘要:最小左转法将平面图转成对偶图,然后扫描线进行点定位。 上述两种算法可看这篇博客 这个图可能存在一个轮廓包含另一个轮廓的情况,那么就把左上角的点连个线就可以了,实现也是用扫描线。 自己看懂了算法代码还是不会写,计算几何过于薄弱。。。可作为板子好好巩固。。。 #include <bits/stdc++. 阅读全文
posted @ 2020-01-25 21:07 Mrzdtz220 阅读(177) 评论(0) 推荐(0)
摘要:就是二分图匹配,直接匈牙利即可。 #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+ 阅读全文
posted @ 2020-01-25 20:45 Mrzdtz220 阅读(85) 评论(0) 推荐(0)
摘要:刚开始想手写平衡树来着,但是发现其实没必要,因为插入操作很友好。 对每个位置维护一个初始位置的值以及末尾位置的值,插入之前和当前位置的末尾值差一下加入set,和下一个位置的初始位置的值差一下加入set,删去当前末尾值与下一位置初始值的差即可。 另外一个也用一个set维护。 #include <bit 阅读全文
posted @ 2020-01-25 20:41 Mrzdtz220 阅读(95) 评论(0) 推荐(0)
摘要:根据奇偶性,把x,y坐标加起来是奇数的位置翻转一下,就变成求最大01子矩阵了。 然后预处理出每个位置往上最长的01路径,每行用一个单调栈解决。 单调栈从栈底到栈顶维护每一个矩阵的高度和宽度,按高度递增维护。 当前高度如果小于栈顶的高度,那就将栈顶的矩阵更新答案,并且出栈,但是它的宽度是可以为当前高度 阅读全文
posted @ 2020-01-25 20:06 Mrzdtz220 阅读(105) 评论(0) 推荐(0)
摘要:基环森林上DP。 我刚开始想的就是找到环,然后把环上每个点及它的子树缩成一个点,就变成一个环上的DP了。然后就是强制第一个不取和强制最后一个不取。 看了别人的题解发现可以不用那么麻烦,只要找到环上任意相邻的两点,强制把这条边断开,然后还是DP两次就行了。 DP方程就比较naive了。 #includ 阅读全文
posted @ 2020-01-25 18:00 Mrzdtz220 阅读(106) 评论(0) 推荐(0)
摘要:平移、旋转、放缩对两个相似三角形没有影响,那么一个长度为 $n$ 的轨迹就可以描述为 $n-2$ 个三角形,每个三角形就用相邻两边长来描述,还得加上第二条线段在第一条线段的逆时针还是顺时针方向,因为如果不加这个就会出现翻不翻转带来的影响,然后就变成了字符串匹配了。不过由于字符集很大,得用 map 来 阅读全文
posted @ 2020-01-25 17:59 Mrzdtz220 阅读(161) 评论(0) 推荐(0)
摘要:能看到其他所有点的区域就是轮廓线的半平面交。 然后最小高度就是半平面交与轮廓线这两个一次分段函数的差,极值肯定出现在分段点上,分别求一下即可。 #include <bits/stdc++.h> #define db double const db eps = 1e-9; inline int sig 阅读全文
posted @ 2020-01-25 14:57 Mrzdtz220 阅读(142) 评论(0) 推荐(0)
摘要:$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\{ 阅读全文
posted @ 2020-01-25 14:54 Mrzdtz220 阅读(88) 评论(0) 推荐(0)
摘要:感觉我双指针不行啊...写了个multiset过的。看了别人代码改了发双指针。 写几个样例大概就知道跟田忌赛马一样了。 #include <bits/stdc++.h> const int N = 1e5 + 7; int a[N], b[N]; std::multiset<int> st1, st 阅读全文
posted @ 2020-01-25 14:51 Mrzdtz220 阅读(114) 评论(0) 推荐(0)
摘要:边染色,顶点的置换导致同构,暴力枚举置换有 $n!$ 种,考虑有多少种置换的贡献相同。 点的一个置换中,对顶点 $u$ 有 $f: u \to p[u]$,边 $(u, v)$ 的置换 $f':(u,v) \to (p[u], p[v])$。当 $u, v$ 同时在一个循环中,循环长度为 $L$,那 阅读全文
posted @ 2020-01-24 14:13 Mrzdtz220 阅读(139) 评论(0) 推荐(0)
摘要:$dp[i]$ 表示以 $i$ 物品为结尾的最小费用 $dp[i] = min(dp[j] + (j - i + \sum c_k - l)^2)$ 斜率优化一下即可。 #include <bits/stdc++.h> #define ll long long using namespace std 阅读全文
posted @ 2020-01-23 14:05 Mrzdtz220 阅读(108) 评论(0) 推荐(0)
摘要:显然有一个DP方程 $dp[i][j]$ 表示到第 $i$ 位已经末尾匹配了 $j$ 位的方案数。 暴力的话就枚举下一位放啥,看放完之后又匹配了多少。 这里可以引入一个 $f[i][j]$ 数组表示从不吉利数字当前匹配了 $i$ 位,加上一个字符能匹配 $j$ 位的方案数。 这一部分可以用kmp得到 阅读全文
posted @ 2020-01-23 14:03 Mrzdtz220 阅读(100) 评论(0) 推荐(0)
摘要:可见的直线为一下凸壳。 先按斜率和截距从小到大排序,再用单调栈判断交点的相对位置即可。 #include <bits/stdc++.h> const int N = 5e4 + 7; const double eps = 1e-7; inline int dcmp(double x) { if (f 阅读全文
posted @ 2020-01-23 13:55 Mrzdtz220 阅读(120) 评论(0) 推荐(0)
摘要:prufer序列为无根树的一种数列。长度为 $n - 2$prufer转无根树将最小编号的叶子删去,prufer序列加入其父亲。重复至树只剩下两个节点。无根树转prufer取出prufer首元素,与待选点集中最小未出现在prufer序列中的点连边,并将该点在待选点集中删去,直至待选点集剩下两个节点, 阅读全文
posted @ 2020-01-23 13:53 Mrzdtz220 阅读(108) 评论(0) 推荐(0)
摘要:$cost[i][j]$ 表示第 $i$ 天到第 $j$ 天都走同一条路线时每天的最小花费,即为 $1$ 到 $m$ 的最短路。dijkstra即可。然后 $dp[i]$ 表示到第 $i$ 天的最小花费$dp[i] = min(dp[j] + cost[j + 1][i] * (i - j) + k 阅读全文
posted @ 2020-01-23 13:47 Mrzdtz220 阅读(96) 评论(0) 推荐(0)
摘要:生成树计数。基尔霍夫矩阵为度数矩阵减去邻接矩阵。无向图生成树计数为基尔霍夫矩阵的行列式可得递推方程$ans = 3 \times f(n - 1) - 2 \times f(n - 2) - 2$$f(n) = 3 \times f(n - 1) - f(n - 2)$加上高精度即可。注意算行列式时 阅读全文
posted @ 2020-01-23 13:45 Mrzdtz220 阅读(124) 评论(0) 推荐(0)

上一页 1 ··· 3 4 5 6 7 8 下一页