51nod
Lqingyyyy
这个作者很懒,什么都没留下…
展开
-
51nod 1706 最短路 + 思维
首先考虑到 会有边重合, 我们思考 如果有边重合 那一定会出现一个起始点 起始点 就是 重合的那个点 那么只需要 将到达点设为 三点的终点 就没有边重合了 51nod的数据较大 需要用deque 优化 bfs#include<iostream>#include<queue>#include<cstring>#define x first#define y secondusing namespace std;typedef long long ll;.原创 2021-09-05 22:27:48 · 109 阅读 · 0 评论 -
51nod1798 打怪兽
设f[i] 为至少击败 i个怪兽的方案数 那么击败i个的方案数则为 f[i] - f[i + 1]答案即为 1~n f[i]的求和设sum[i]为前 i个怪兽的攻击力因为能量从1 ~ n分别为 0~n - 1那么 1 ~ i + 1都是可以被选择为前 i 个的 所以每次就是 乘2如果sum[i] >= m的话那么就是 2^i * fac[n - i]如果sum[i] < m的话 就要从前面选择一个 去减掉 因为每次都乘 fac[n - i]所以和只需要看 i 只需要存一个优先队列 .原创 2021-09-03 16:19:02 · 135 阅读 · 0 评论 -
51nod 1830
所以只需要用线段树合并一下就好了#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#define x first#define y secondusing namespace std;const int N = 5e5 + 10,M = N * 2;typedef long long ll;typedef pair<int,int>..原创 2021-09-02 16:06:46 · 76 阅读 · 0 评论 -
51nod2614 小B爱旅行 (参考范艺杰代码 基本抄袭 太难了)
由题意可知 图是由 环 和 直链组成的 若 环能到达 那么 能到达的直链 都能和环组成 一组数 因为 每个到达环的路径再回来 把到环上的直链抵消了所以我们 可以考虑 把环上的值全都扔进线性基 再看直链上有哪些值是能和环组成新值的如果 线性基里能组成的 那么链上的就无需加入 若不能组成的 那么 一定会有一位 是线性基里所没有的那么答案就是 (1<<sz) * s.size() s表示线性基组成不了的数的个数 sz表示线性基里的元素个数2.删边我们可以考虑离线从后往前加边 若加的边多环 那么.原创 2021-09-01 21:42:37 · 172 阅读 · 0 评论 -
51nod 2877熟练使用tarjan的知识
我一开始想到tarjan 没想到咋做 看了题解直呼妙阿考虑一个点有多个子块 若子块中的点不能回到父节点 那么这个子块 就和 其他子块是不能互相到达的这时候只需要记录 已经遍历的多少子块即可 这样不会重复#include<bits/stdc++.h>#define INF 0x3f3f3f3f3f3f3f3fusing namespace std;const int N = 1e6 + 10,M = 5e5 + 10;typedef long long ll;typedef .原创 2021-08-06 10:15:32 · 98 阅读 · 0 评论 -
51nod2861 2-sat
列如 h1 m2则 转换成 选了m1 必须选 m2即可#include<bits/stdc++.h>#define INF 0x3f3f3f3f3f3f3f3fusing namespace std;const int N = 2010,M = 2010;typedef long long ll;typedef pair<int,int> PII;typedef unsigned long long ull;char a,b;int head[N],to[M]原创 2021-08-05 15:04:26 · 86 阅读 · 0 评论 -
51nod2884
水题 阿 就是先求出 最短路树 然后 从树的底端开始删点就好了#include<iostream>#include<queue>#include<utility>#include<cstring>#include<algorithm>#include<vector>#define x first#define y secondusing namespace std;const int N = 3e5 + 10,.原创 2021-06-24 10:52:53 · 140 阅读 · 0 评论 -
51nod1201 dp整数划分
数据是5e4 考虑最基本的dp 前 i 位由 j个不同的数组成有多少种 首先可以用二分先 找出那个最多的不同的数 是 350 然后我们考虑状态转移 最简单的就是 每一次新增一个 1 那么我们如何去新增一个1而使1不重复呢 我们可以把前面所有的数都先加一个 1 然后再加一个1 那么就是 dp[i - j][j - 1] 我们可以发现 前面的数全都加一个一 也是不会重复得所以 dp[i][j] = dp[i -j][j - 1] + dp[i - j][j ];#include<iostream>.原创 2021-06-16 12:47:44 · 109 阅读 · 0 评论