
c++
Lqingyyyy
这个作者很懒,什么都没留下…
展开
-
最大食物链计数 洛谷 - P4017
给出n个顶点和m的路径数量。原创 2025-03-11 11:14:10 · 99 阅读 · 0 评论 -
sa后缀数组使用合集,包括height数组求LPC和LCS,ST表,单调队列优化。
后缀数组使用原创 2022-11-30 18:31:30 · 222 阅读 · 1 评论 -
P1110 [ZJOI2007] 报表统计
数据结构原创 2022-11-29 14:21:04 · 240 阅读 · 0 评论 -
牛客小白月赛48 F
dp就完事了原创 2022-10-19 14:54:24 · 101 阅读 · 0 评论 -
P1005 [NOIP2007 提高组] 矩阵取数游戏
NOIP2007提高组原创 2022-09-17 17:18:18 · 787 阅读 · 0 评论 -
Bellman - Ford的证明
bellman-ford证明转载 2022-09-09 12:59:11 · 455 阅读 · 0 评论 -
CF1612G
CF原创 2022-09-02 18:51:39 · 145 阅读 · 0 评论 -
童心智造2022.09.01 树状数组训练专题题解
训练原创 2022-09-02 18:45:34 · 273 阅读 · 0 评论 -
牛客思维一题
算法原创 2022-08-19 16:40:02 · 159 阅读 · 0 评论 -
网络编程,系统编程记录
网络编程,系统编程常用的函数原创 2022-08-16 23:59:02 · 81 阅读 · 0 评论 -
深入理解计算系统第三章程序的机器级表达总结
深入理解计算机系统 第三章总结原创 2022-08-01 18:31:00 · 1384 阅读 · 0 评论 -
C/C++知识总结
对于c语言c++的一些知识的积累归纳原创 2022-07-31 22:00:42 · 11934 阅读 · 5 评论 -
AtCoder Regular Contest 129 D题
题目题意是给你一个数组 有一个操作 是对于 i - 1 i i + 1 分别 -1 + 2 -1 若选 i == n i + 1 = 1首先我们就知道一个思路 -1 +2 -1 是 很明显的 一个差分数组后的一个方案 但是我有点nt 我进行了两次前缀和 使得最后得题意转化成了 给你个数组 每次操作可以让其中一个数 -1 最后得数组要变为递增 所以。。完全搞不来了 但是只前缀和一次的话 就是个经典问题 每次 操作 -1 +1 使得数组变为0 那就只要进行两次循环 暴力即可#include<原创 2021-11-25 00:00:29 · 356 阅读 · 0 评论 -
Codeforces Round #755 (Div. 2, based on Technocup 2022 Elimination Round 2) E题
题意是 给你 个长度为 n的 数组 找到 子区间 l ~ r 使用1个操作 ai - 1 ai +1 - 1使得 所有子区间元素变为 0 的个数方法一: 考虑如何让子区间变为0 那肯定是 从左到右不停减去自身 使得最后一个元素 为 0 既 al - al + 1 <= 0 al + 1 - al - al + 2 <= 0 直到最后一个为0即可 我们只需要找到 第一个 > 0的位置并且 找到 0的个数就行 所以我们考虑维护 维护一个B数组上述1 ~ n的前缀 若我们要使 l为第一个位原创 2021-11-18 14:18:52 · 380 阅读 · 0 评论 -
牛客月赛40 H rank1哥的妙蛙思想
题目链接大致思想就是假设有x的话那么直接输出就好了 如果 没有 x我们看他的倍数 y1 y2 y3… ym 如果 y2…ym都是 y1的倍数的话 那么肯定是不行的所以他这里做了一个处理 将每个数做后缀和 并且 开qpow(2,cnt) - 1 第二部分就是相减 如果 都是y1的倍数的话 那么 y1 要减去 y2…ym的数 又因为x是与他们相关的那么 x - y1 - y2…ym 又因为 y1 = y1 - y2…ym 且 x = y1 所以会变为 0 此时就是不存在这种情况 反之则存在 真的妙!#p原创 2021-11-05 23:16:04 · 108 阅读 · 0 评论 -
溪染的矩阵 牛客ioi周赛 24 B
按照矩阵乘法形势 进行异或和给出的 都是 01矩阵 所以 只有 4种情况 那么就是1 ^ 0, 1 ^ 1, 0 ^ 1, 0 ^ 0;值分别为 1,0,1,0 所以完全可以把他当作加减来看待每一次异或就是 abs(a - b)当 a 为 1的时候 abs (a - b) 一定等于 a - b当a 为 0 的时候 abs(a - b) 一定等于 a + b所以无论如何 都会 加上 a 所以我们不妨把a全部都先加上讨论b的时候 我们可以考虑 当 b等于 1 或者 等于 -1 或者 等于 0的.原创 2021-04-06 18:40:04 · 114 阅读 · 0 评论 -
codeforces 712 div2 CDE
C题就是一个字符串模拟吧首先考虑到 0是被扭曲了的 所以至少需要 偶数个 0才能扭曲回来又由于 0起手是肯定错的 因为 如果是 0的话 上面 ( 下面就是 ) 错了所以一定是 10起手 因为 有 1 所以 1也要为 偶数个所以只要 判断 1 0 是否为 偶数个 并且 0是否都包括在 1里面就行输出得话 只要 前一半 1都输出 ( 后一半 1输出 ) 就稳定了0的话 那就 先 ( 后 ) 一个一个换着输出就好了因为你 0 是 先一半 ( 再后一半 ) 的话最后面 就是 ((((((( 如果没有原创 2021-04-04 17:24:53 · 120 阅读 · 0 评论 -
CF 1286A 动态规划
思路是 设dp[i][j][k] 前i个数有j个偶数第i个数为奇数 或者 偶数#include<iostream>#include<cstring>using namespace std;const int N = 110;int a[N];int dp[N][N][2];//dp[i][j][0]前i个数有j个偶数 第 i个为偶 int main(){ memset(dp,0x3f,sizeof dp); int n; cin >> n;.原创 2021-03-27 22:10:21 · 160 阅读 · 0 评论 -
单调队列优化分组背包 牛客练习赛79 Problem E Solution
通过好兄弟OMG_link的题目的启发 成功学了一波 单调队列优化dp好兄弟的题解#include<iostream>#include<cstring>#include<queue>using namespace std;const int N = 10010,M = 1010;int dp[N],a[M],b[M],c[M];int main(){ int t; cin >> t; while(t--){ memset(dp原创 2021-03-27 17:13:26 · 145 阅读 · 0 评论 -
710 div3 时隔多久再次ak
D大意就是让你 一次可以反转两张不同样的牌 直到反转到不能反转了 问你最少剩下几张反转由于数据比较大 1e9 所以一个离散化就完事了#include<iostream>#include<algorithm>using namespace std;const int N = 2e5 + 10;int a[N],b[N],c[N];int main(){ int t; cin >> t; while(t--){ int n; cin &g原创 2021-03-26 16:00:30 · 141 阅读 · 0 评论 -
Codeforces Round #613 (Div. 2) D 1285D
由题意可以知道我们需要把 每个ai分成 二进制的形式来解体当二进制 的这一位 若每一个ai都为1的话 那么直接改为0即可若有 1 也有 0 的话 那就要选择了 是选择去 1的那边 还是 0的那边这个时候就需要用递归来做了复杂度就为 (log(max(a[i]) * n);#include<cstring>#include<iostream>#include<vector>using namespace std;const int N = 1e5 +原创 2021-03-24 15:32:52 · 72 阅读 · 0 评论 -
HDU - 3873
首先由题意可以知道1.你到达一个城市 若他有保护罩 你必须去保存保护罩发射器的地方去摧毁掉2.他是有很多人可以同时进行3.若你到达了一个地方 但是他的保护罩没有摧毁掉 你必须摧毁掉他的保护罩才能算完全到达由上面知道 首先这是一个拓扑图然后只需要从能跑的地方一个一个跑接下来的地方即可#include<iostream>#include<cstring>#include<vector>#include<utility> #include<原创 2021-03-21 10:21:53 · 138 阅读 · 0 评论 -
Codeforces 1354 E. Graph Coloring(dfs + dp)
基本思路就是把图转化成二分图由二分图 染色法来推断是否能成功使用由于大部分都要用 2来染色第二个判断就是来判断 2是否够用那就需要用到 背包来判断判断完后 继续用dfs来染色就好了#include<iostream>#include<utility>#include<cstring>using namespace std;int n,m,a,b,c;const int N = 5010,M = 2e5 + 10;int head[N],原创 2021-03-18 23:34:39 · 181 阅读 · 0 评论 -
HDU - 4114
思路是 三维状压dp + floyd更新dp[i][j][k] i表示为已经走过的景点 j表示为 已经获取的经典的pass票 k表示最后一次走到的地方是 k#include<iostream>#include<cstring>using namespace std;const int N = 55,M = 1 << 8;int a[N][N],pos[N],T[N],FT[N],pass[N];int n,m,k;void floyd(){ fo原创 2021-03-18 13:58:47 · 115 阅读 · 0 评论 -
HDU - 3986 去掉一条边 使最短路最大
一直没想到怎么做因为复杂度标程也是卡过去的估计= =如果按照一条直线出数据的话那就是20 * (5e4 + 1000) * (5e4 + 1000) / 2 * log(5e4)很明显爆掉了。。。但是事实就是只要遍历最短路的就完事了#include<iostream>#include<cstring>#include<utility>#include<queue>#define x first#define y secondusing原创 2021-03-15 23:59:03 · 226 阅读 · 0 评论 -
二分图匹配 Hopcroft-Carp (HK) 算法 加强版 匈牙利
#include<iostream>#include<cstring> #include<queue>using namespace std;const int N = 3e3 + 100,M = N * N;int n,m;int head[N],to[M],last[M],cnt;void add(int a,int b){ to[++cnt] = b; last[cnt] = head[a]; head[a] = cnt;}int原创 2021-03-14 19:41:28 · 219 阅读 · 0 评论 -
AcWing 214. Devu和鲜花
首先我先提出一个模型b个盒子里面每个盒子里面有无限多个花问取m支有多少种取法我们设在第一个盒子取x1,第二个x2 x3 …xn所以x1 + x2 + x3 +…+ xn = m当我们取每个盒子至少为1的时候即为(x1 + 1)+(x2+1)+…+(xn + 1) = m + n;此时我们可以采取隔板法n+m个球 n + m - 1 个位置 隔 n - 1块板即cal(n+m-1,n-1)即为答案转述到这道题每个盒子都有限制即x1 <= a1 x2 <= a2… xn &.原创 2021-03-08 09:52:49 · 166 阅读 · 0 评论 -
图论的知识
图论之二分图(1) 二分图的最小路径覆盖1.最小不相交路径覆盖 :Res == 节点数-最大匹配数2.最小可相交路径覆盖:首先floyd算法跑出所有可以到达的点,之后Res==节点数-最大匹配数(2)二分图的最小顶点覆盖:定义:若选择一个点说明选择与它相连的所有边,最小顶点覆盖就是选择最少的点来覆盖所有的边。最小定点覆盖==二分图最大匹配(3)二分图最大独立集定义:选出一些顶点使得这些顶点两两不相邻,则这些点构成的集合称为独立集。最大独立集为包含顶点数最多的独立集。定理:最大独立集 =.原创 2021-03-02 12:28:37 · 796 阅读 · 0 评论 -
数论专题1
112原创 2021-02-18 12:49:59 · 1541 阅读 · 0 评论 -
ARC105C 好题!
骆驼过桥dp二分题意是n(<=8)只骆驼 有重量 要过桥 桥分成好几段 每段都有长度和承受重量 问第一只骆驼和最后一只骆驼 最小距离 多少能过桥给定思路:骆驼过桥 如果 过长度相同的桥 那么只看承受重量最低的就好了如果过重量相同的桥 那么只看长度最长的桥就好了所以 遇到 桥段a 的长度比 桥段b 的长度 短 而且 桥段 a的承受能力 比 桥段 b的承受能力 大 那么 桥段a就是废桥所以由此考虑 我们只需要把 把长度当作 第一首选 重量当作第二首选进行排序就好了 如果 后面长度大 且 承受能力原创 2021-02-16 15:07:38 · 286 阅读 · 0 评论 -
km算法对最大全职匹配bfs算法的解释理解 n^3
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int N = 510,INF = 1e18;ll n,m;ll a[N][N];ll ex[N],ey[N],visy[N],now;ll match[N],pre[N],slack[N];v原创 2021-02-08 15:41:03 · 296 阅读 · 0 评论 -
CodeForces 1433G
一开始看复杂度挺吓人的毕竟跑 n次最短路就是 n * m一共就是 1000 * (1000 * 999)但是写出来之后还是没有超思路就是跑n遍最短路然后遍历m条边 看哪个最小#include<iostream>#include<utility>#include<queue>#include<cstring>#define x first#define y secondusing namespace std;const int N =原创 2021-01-23 13:41:41 · 150 阅读 · 0 评论 -
Codeforces Round #696 (Div. 2)D
首先的一个思想肯定是想到如何将所有变成0那就是从前往后遍历a[2] = a[2] - a[1]a[3] = a[3] - (a[2] - a[1])以此类推直到a[n] = 0才算符合条件所以此时只要从 1 - n - 1中选出一个数和后者相交换然后判断合法性即可这样的复杂度需要 on2那肯定是不行的再次我们想到 交换 ai 和 ai + 1 的话1 - i的数都是不变的 所以我们可以用前缀和来储存 1 - i的值再次我们想到 如果是保证交换的值改变的话 i + 2 - n这一部分也是不会原创 2021-01-20 22:12:32 · 183 阅读 · 0 评论 -
牛客小白赛31A
我是如何写的呢首先我们从组合数学可以知道如果把数变成二进制的话 如果进制上全为1的话 说明是全部情况都有的所以 只要a 上有的 b上没有即可 假如 a上有2个1 b是n位1所以有的情况就是 1<<(n - 2)种情况结合这个 我们就要往这方面想 那么就要想数据的大小 并且凑齐全部1都有的情况然后就可以想到 如果 ai是1的话 那么 ai-1,ai-2直到a1 可以取到全是1的情况那么就变成一个层 1 - (1 << (i - 1))再来一个j 那就是(1 <&.原创 2021-01-11 15:11:49 · 108 阅读 · 0 评论 -
洛谷P1640 [SCOI2010]连续攻击游戏
今天在看题解查如何缩减复杂度的时候看到一个巨巨方法用时间点来查重!由于每一次memset来实在是太慢了直接记录每一次进去的大小比如第一次进入是 1 只需判断vis[i]是否为1就行第二次进入是2 只需判断vis[i]是否为2就行!!太巨了膜拜 我洛谷直接关注#include<iostream>#include<cstring>#define IOS ios::sync_with_stdio(false)using namespace std;const in原创 2020-12-30 14:58:52 · 146 阅读 · 0 评论 -
Educational Codeforces Round 101 (Rated for Div. 2) C
题目大意:给你一堆高度去建围栏,这些围栏必须有公共边,第一个和最后一个围栏必须挨着地面,其他围栏可以浮空,但不能超过k - 1那我们就从前往后推呗主要思路就是确定每个栅栏的最小最大值设 l 为最小值 r 为最大值第一个栅栏的时候l = a[1] r = a[1]第二个栅栏的时候l = a[i] , r = r + k - 1r就是不能超过上一个的最大界限 因为上一个最多 +k 要大于这一层的基层并且不能超过第三个同理第四个l = max(l - (k - 1),a[i])因为上原创 2020-12-29 18:48:11 · 447 阅读 · 3 评论 -
关于有向图强连通分量 和 无向图双联通分量的理解
有向图的强连通分量1.强连通 代表的是 这个连通块中的每两个点互相都是有一条路径是可以走到的2.分量 就是子图;从这张图上可以看出 A B C这三个点都是互相可以走到的 所以他们就是一个联通块 D E F 三个点都是单向能走到 所以D E F 分别为三个联通分量所以这个图中 一共有 四 个连通分量然后又引入一个概念 缩点 将连通块中的点当成一个点可以用来求 连通块问题我们知道概念了 该如何去求这个图中有几个连通分量呢引用时间戳这个概念A - > B -> D -> E原创 2020-12-25 18:15:19 · 1866 阅读 · 1 评论 -
acwing368 银河 强连通分量 来求 差分约束
大致思路就是 按差分约束建图 然后 如果成环的话 那就是 A >= B B >= C C >= A 所以 A = B = C ;如果不相等那就不成立 如果都成立的话按照缩点 来看环之间的关系 因为环中的值都一样 所以只要求出 环值*环中的数 就可以求值#include<iostream>#include<cstring>#define IOS ios::sync_with_stdio(false)using namespace std;const in原创 2020-12-23 14:41:07 · 109 阅读 · 0 评论 -
CF691 C题的证明
设gcd(x,y)=d,则满足x=k1d,y=k2d,易得k1与k2互质。情况1:x=y。显然,gcd(x,y)=x=gcd(x,0)=gcd(x,y-x)。情况2:不妨令x用反证法。假设k1,(k2 - k1)不互质,令gcb(k1.k2-k1) = m(m为正整数且m>1);k1 = ma,k2 - k1 = mbk2 = (a+b)m即k1,k2有公约数m,与k1,k2互质矛盾所以假设不成立即k1,(k2 - k1)互质所以gcb(x,x-y) = d = gcb(x,y)原创 2020-12-21 19:55:57 · 297 阅读 · 0 评论 -
昨天div3阿克了~
A题模拟看题意;#include<iostream> using namespace std; const int N = 310;int a[N]; int main(){ int t; cin >> t; while(t--){ int n; cin >> n; for(int i = 1; i <= n; i++){ cin >> a[i]; } int l = 1,r = n; for(int原创 2020-12-17 21:02:59 · 216 阅读 · 0 评论