
51nod
Lqingyyyy
这个作者很懒,什么都没留下…
展开
-
51nod 1706 最短路 + 思维
首先考虑到 会有边重合, 我们思考 如果有边重合 那一定会出现一个起始点 起始点 就是 重合的那个点 那么只需要 将到达点设为 三点的终点 就没有边重合了 51nod的数据较大 需要用deque 优化 bfs #include<iostream> #include<queue> #include<cstring> #define x first #define y second using namespace std; typedef long long ll; .原创 2021-09-05 22:27:48 · 127 阅读 · 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 · 149 阅读 · 0 评论 -
51nod 1830
所以只需要用线段树合并一下就好了 #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #define x first #define y second using namespace std; const int N = 5e5 + 10,M = N * 2; typedef long long ll; typedef pair<int,int>..原创 2021-09-02 16:06:46 · 93 阅读 · 0 评论 -
51nod2614 小B爱旅行 (参考范艺杰代码 基本抄袭 太难了)
由题意可知 图是由 环 和 直链组成的 若 环能到达 那么 能到达的直链 都能和环组成 一组数 因为 每个到达环的路径再回来 把到环上的直链抵消了 所以我们 可以考虑 把环上的值全都扔进线性基 再看直链上有哪些值是能和环组成新值的 如果 线性基里能组成的 那么链上的就无需加入 若不能组成的 那么 一定会有一位 是线性基里所没有的那么答案就是 (1<<sz) * s.size() s表示线性基组成不了的数的个数 sz表示线性基里的元素个数 2.删边我们可以考虑离线从后往前加边 若加的边多环 那么.原创 2021-09-01 21:42:37 · 198 阅读 · 0 评论 -
51nod 2877熟练使用tarjan的知识
我一开始想到tarjan 没想到咋做 看了题解直呼妙阿 考虑一个点有多个子块 若子块中的点不能回到父节点 那么这个子块 就和 其他子块是不能互相到达的 这时候只需要记录 已经遍历的多少子块即可 这样不会重复 #include<bits/stdc++.h> #define INF 0x3f3f3f3f3f3f3f3f using namespace std; const int N = 1e6 + 10,M = 5e5 + 10; typedef long long ll; typedef .原创 2021-08-06 10:15:32 · 112 阅读 · 0 评论 -
51nod2861 2-sat
列如 h1 m2则 转换成 选了m1 必须选 m2即可 #include<bits/stdc++.h> #define INF 0x3f3f3f3f3f3f3f3f using 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 · 103 阅读 · 0 评论 -
51nod2884
水题 阿 就是先求出 最短路树 然后 从树的底端开始删点就好了 #include<iostream> #include<queue> #include<utility> #include<cstring> #include<algorithm> #include<vector> #define x first #define y second using namespace std; const int N = 3e5 + 10,.原创 2021-06-24 10:52:53 · 164 阅读 · 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 · 123 阅读 · 0 评论