随笔分类 - luogu
摘要:#include<iostream> using namespace std; const int N = 20; string g[N]; int n; int maxv; int st[N]; void dfs(const string &s, int len, int u){ for(int
阅读全文
摘要:$f(i, j)$表示走到第j个点,走过的路径情况是i的所有走法的集合,存储最短距离属性。 $f(i, j) = min {f(i, j), f(i - { j }, k)}, k = 0, 1, ..., n - 1$其中k是当前路径i下走到j的上一个点。 #include<iostream> #
阅读全文
摘要:这题预处理比较蛋疼,因为可能出现陨石攻击区域重合和同一个格子多个陨石的情况,要先看一下这个位置是否被其他陨石影响,如果已经被影响,就应该取两者时间的较小值,随后更新当前这个陨石的影响范围,注意:如果这个陨石影响的区域中如果存在已经被其他陨石影响的情况,就取两者最小值,否则设置为当前陨石的时间 #in
阅读全文
摘要:凡是存在边的两个点,设它们的边权为0,其他不存在边的两点之间的距离按照欧拉距离来算,这样只要求一遍最小生成树就可以得到加边的最小值。 复杂度:\(O(n^2)\) #include<iostream> #include<cstring> #include<cstdio> #include<cmath
阅读全文
摘要:题意:求从1到[2, n]中每一个点的最短路$k_i$,再求从[2, n]的每一个点出发到1的最短路$p_i$, 求所有$k, p$的和。 堆优化dijkstra \(O(nmlogn)\):40pts #include<iostream> #include<cstring> #include<qu
阅读全文
摘要:历程 裸dijkstra \(O(QN^2)\),TLE 堆优化dijkstra \(O(QMlogN)\),TLE floyd \(O(QN^3)\),TLE floyd第一次优化 $O(QN^3) $, TLE floyd第二次优化 \(O(N^3)\), WA floyd第二次优化改写 \(O
阅读全文
摘要:对于一个值x,如果能够满足牛之间的最短距离>= x,则所有小于等于x的值t均能够满足存在一种安排方法能够使奶牛之间的最短距离大于等于t。所以可以二分找最短距离的最大值。 复杂度:\(O(nlog(1e9))\) #include<iostream> #include<algorithm> using
阅读全文
摘要:实数二分题,二分+贪心check 如果存在一种使用方法使得使用时间$\ge x$,那么所有小于等于x的时间t都能够满足条件。所以可以通过二分得到使用时间的最大值。 复杂度:\(O(nlog(T))\) #include<iostream> using namespace std; const int
阅读全文
摘要:二段性:对于一个值x,如果能够通过添加不超过k个木棒使得最大距离小于等于x,那么所有大于x的值t都能够通过添加不超过k个木棍使得最大间距小于等于t. 复杂度:\(O(nlog(L))\) 还是类似的二分+贪心 #include<iostream> using namespace std; const
阅读全文
摘要:坑点: 月利率可能大于1,二分范围要定在1~5 需要还的钱,随每个月的利息和还钱数变化 #include<iostream> using namespace std; double m, n; int k; int check(double v){ double sum = m; for(int i
阅读全文
摘要:二段性:如果对于一个值x,存在一种M分段方法,能使得分段中的最大值满足$\le x$那么所有大于等于x的值t都存在M分段的方法使得分段最大值小于等于t。 题目要求分段最大值的最小值,所以可以用二分。 检查一个x值,能不能通过分M个段达到分段最大值$\le x$, 这个用贪心来做,让每一个分段尽可能大
阅读全文
摘要:二段性:对于一个长度x,如果能够通过拿走不超过m个石头使得石头之间最短距离大于等于x,那么所有$\le x$的长度$t$都能够通过移动不超过m个石头达到最短距离大于等于$t$的要求。 所以可以求出移动不超过m个石头能够达到的最短距离的最大值,判断一个长度x是否满足的条件就是求出要求最短距离大于等于x
阅读全文
摘要:实数二分的题。 第一次写的时候,发现这样的写法无法处理mid正好是根的情况,会重复输出mid。 巧就巧在这题的数据保证不会出现长度为1的区间内出现2个根的情况,所以可以改写代码。 原始代码 #include<iostream> #include<cstdio> using namespace std
阅读全文
摘要:二段性:如果高度$h$满足要求,那么所有的满足$\le h$的高度都满足,若$h$不满足,那么所有$\ge h$的都不满足。 二分答案,找满足要求的最大$h$ 复杂度:\(O(nlog(1e9)) = O(n), n \le 1e6\) #include<iostream> using namesp
阅读全文
摘要:对数组升序排序,枚举A $A-B=C$问题转化为对于A在A之前找等于$A-C$的值的个数,可以用二分做 复杂度:\(O(nlogn)\) #include<iostream> #include<algorithm> using namespace std; #define LL long long
阅读全文
摘要:#include<iostream> using namespace std; const int N = 1024, M = 2048; char g[N + 1][M + 1]; int n; /* /\ /__\ */ void dfs(int n, int x, int y){ if(n =
阅读全文
摘要:#include<iostream> #include<vector> using namespace std; typedef struct{ int x, y, c; }Node; vector<Node> res; void dfs(int k, int x, int y, int dx, i
阅读全文
摘要:题意:给定一个序列s,用它能够生成一个无限长的序列 第一个序列:\(s1 = s\) 第二个序列:\(s2 = s1 + s1'\) 第三个序列:\(s3 = s2 + s2'\) ... 其中$si'$表示将$si$中的最后一个元素放到最前面形成的新序列。 思路:把一个序列看成前半部分和后半部分,
阅读全文
摘要:状态转移方程:\(f(i) = f(i - 1) + f(i - 2) + s(i - 3) * 2\),其中$s(k) = f(1) + ... + f(k)$ #include<iostream> using namespace std; const int N = 1e6 + 10, mod
阅读全文
摘要:01背包变形 \(f(i, j) = f(i - 1, j) + f(i - 1, j - v[i])\) 初始条件要注意:f[0~n][0] = 1; 代码 #include<iostream> #include<vector> using namespace std; const int N =
阅读全文

浙公网安备 33010602011771号