思维
Lqingyyyy
这个作者很懒,什么都没留下…
展开
-
sa后缀数组使用合集,包括height数组求LPC和LCS,ST表,单调队列优化。
后缀数组使用原创 2022-11-30 18:31:30 · 198 阅读 · 1 评论 -
P1110 [ZJOI2007] 报表统计
数据结构原创 2022-11-29 14:21:04 · 213 阅读 · 0 评论 -
CF1761D Carry Bit
CF原创 2022-11-22 12:52:45 · 245 阅读 · 0 评论 -
牛客小白月赛48 F
dp就完事了原创 2022-10-19 14:54:24 · 94 阅读 · 0 评论 -
童心智造2022.09.05线段树练习
1原创 2022-09-06 22:15:12 · 185 阅读 · 0 评论 -
牛客思维一题
算法原创 2022-08-19 16:40:02 · 150 阅读 · 0 评论 -
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 · 342 阅读 · 0 评论 -
CF1575 K 思维
链接题意就是 给你一个大矩阵 和两个大小相同的子矩阵 但是 左上角的点可能不同 然后矩阵种得点的颜色要相同 问一共有多少种方案我们很容易进入一个误区这种情况里4个点是需要相同颜色的 我们就会想要去找 有多少个点和当前点颜色相同 但是其实 我们只需要考虑第一个矩阵不重叠的部分 因为矩阵2的部分一定会和矩阵1不重叠的部分一一对应 所以我们只需要 qpow(k,nm-rc)就行了...原创 2021-11-21 17:17:39 · 259 阅读 · 0 评论 -
CF1600E 博弈论 思维
Alice 和 Bob 正在玩一个游戏。他们得到了一个长度为 NN 由整数组成的数组 AA。他们正在一起建立一个序列。在开始的时候,这个序列是空的。在一个回合中,玩家可以从数组的左边或右边移出一个数字,并将其添加到序列的右侧。规则是:他们所建立的序列必须是单调递增的。赢家就是是做出最后一步的玩家。Alice 是第一个玩的。假设他们都以最佳方式进行游戏的情况下,谁能赢得游戏?题目链接首先能考虑到的就是 最大前缀递增 和最大后缀递减分别设他们大小为 C1 C2若 C1 C2都为奇数的话 无论怎么原创 2021-11-09 21:30:56 · 2621 阅读 · 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 · 100 阅读 · 0 评论 -
牛客2021年国集 第7场第4题和CF 1602E 思维+线段树
牛客题目牛客题意是 给出 1 ~ n其中 n / 2个偶数 的序列 然后插入 1~n n/2个奇数 问最小逆序对首先我们能想到 插入的数对 已经在原序列的数 是没有影响的 每当插入一个点时 逆序对增多的数量就是前面比他大的个数 和后面比他小的个数 这样 可以发现 我们插入 一定是从小到大 从左到右插入 这样后面插入的数 对已经插入的数 也是没有影响了的 我们只需要贪心插入即可 只要找到每个插入的最小影响值即可 我们可以想每当 插入 1 于数组 和插入 2于数组 会对数组产生 什么影响 是不是 若 把原创 2021-10-26 20:35:48 · 157 阅读 · 0 评论 -
2018 ccpcfinal Gym - 102055B滑动窗口
题意问你 给你 n个人 每个人 有两种属性 可以选择 A 选择 B 但是有些人 不能同时选 A或者 同时选B 问最后得到的 MAX - MIN 最小首先没有 人限制的话 那么就是个经典题 滑动窗口求 差值最小 只需要把两个值拆分 sort一下 然后每次找到 n 个人 的属性取一下 min 即可有限制的话 无非是 把人变成了联通块 多个联通块 组合求差值 此题 是 每个人选择两种值 每个联通块就有两种 maxn 和 minn 我们只需要拆分成 4种值进行排序即可#include<iostream&原创 2021-10-14 13:14:03 · 154 阅读 · 0 评论 -
hdu2121 最小树形图 (无根)
加入一个虚点 往每条边放入INF 这样的话 最多只有一条边会与他 相连只需要记录一下第几个点是和虚点相连即可注意!不查重比较简便!#include<iostream>#include<cstring>#define INF 0x3f3f3f3fusing namespace std;const int N = 1100,M = 11000 + N;struct node{ int x,y,w;}a[M];int dis[N][N];int n,m原创 2021-10-03 14:49:56 · 145 阅读 · 0 评论 -
51nod1656 合并trie树
给每个子树存一个 size 因为 我们只需要每个字符出现一次 所以如果x 或者 y一个没有的话才能返回 不然的话 就会重复#include<iostream>#include<cstring>#define x first#define y secondusing namespace std;const int N = (3e5 + 10) * 2,M = N * 2;typedef pair<int,int> PII;typedef long lo原创 2021-09-15 22:13:55 · 244 阅读 · 0 评论 -
牛客练习赛88 D 克鲁斯卡尔重构树
首先题目要求我们找的是 最小生成树上路径的最大值 倘若我们用普通的树上 lca去寻找的话 是需要logn级别去查询的 但是询问有1e7 所以我们考虑别的方法 思考到克鲁斯卡尔重构树 边权值小的在最下面 边权值大的在最上面 所以我们 可以使用lca o1查询 直接查询到 最大边权#include<iostream>#include<cstring>#include<cmath>#include<algorithm>#define x first#..原创 2021-09-15 12:17:49 · 125 阅读 · 0 评论 -
洛谷P4197 Peaks 线段树合并
考虑离线 然后 从权值小的开始建边 进行线段树合并#include<iostream>#include<algorithm>using namespace std;const int N = (5e5 + 10) * 4;typedef pair<int,int> PII;int h[N];int n,m,q,fa[N];struct node{ int x,y,w,type,id; bool operator < (con.原创 2021-09-13 22:35:24 · 146 阅读 · 0 评论 -
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 · 119 阅读 · 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 · 143 阅读 · 0 评论 -
Codeforces Round #738 (Div. 2) E
首先可以想到 题目如果通过正面来求的话 那么所需要求的种类很复杂 所以很容易想到容斥的思想 我们就可以想到 将所有组建情况再减去 gcd不是 1 的情况即可1.组建所有情况 就可以考虑 dp 前 i个数 组成 m 的种类有多少 很明显 是个背包 但是 复杂度为 nm * (ri - li)所以超时 考虑优化 因为 ri ~ li是连续的 所以可以使用前缀和优化至 2nm2.gcd不是1的情况 那么就可以变成 gcd 为2 为 3.。。。。为 m的情况 考虑2的时候 我们可以把所有2的倍数往上放 3的时候原创 2021-08-17 14:46:49 · 147 阅读 · 0 评论 -
牛客多校2 G League of Legends
#include<iostream>#include<cstring>#include<algorithm>#include<map>#include<vector>using namespace std;const int N = 5e3 + 10;int n,k;struct node{ int l,r; bool operator < (const node &p)const{ .原创 2021-07-29 22:39:08 · 118 阅读 · 0 评论 -
E - Digit Products 实在是瞎搞
首先我是想把题目分成好几部分来做 首先是第一部分 列如88897 我们找到它的最高位 然后先把10000以下的算出来 如何去算呢 分成两部分 一部分是 没有0的 一部分是有0的 有0这一部分用dp + map就可以了因为 最多组成的乘积有 9^9 / 9! 为1000多一点 所以开map是完全没问题的 没有0的部分用容斥的思想 就是全部数减掉 每位都>=1 的情况因为我们这个是只能在整数部分 就是后面每位都可以取到9的情况 我们不妨从前往后 把每一位的小一位取出来 去求 数量 最后统计一下即可#原创 2021-07-05 23:10:39 · 226 阅读 · 0 评论 -
51nod2910 匹配 最大权值匹配 (完美匹配) 或者最大流最大费用流
首先这题我是想用最大流最大费用流做 毕竟很好想 求一个完美匹配 然后暴力枚举 即可 但是算法复杂度好像变成了 n^3m貌似超时了 我就试了试 然后在51nod超时了 在洛谷过了= =离谱#include<iostream>#include<queue>#include<cstring>using namespace std;const int N = 210,M = (110 * 110 + 110 + 110) * 2;int n,S,T;int原创 2021-06-20 15:31:47 · 172 阅读 · 0 评论 -
CF1316 和 E
D的大意就是能否找到一个按题目要求的模拟的东西首先一个数想要到达终点 他经过的点都是要和他一个终点的 并且终点的终点是他自己那么就可以先把所有终点的终点是自己的 且 其他点的终点是他的终点的 dfs出来如果是死循环的话 那么就先两两互相连 比如 左边的点到右 然后右边的点到左 这个时候在dfs找一下有没有和他们一样需要死循环的就行了#include<iostream>#include<cstring>#include<algorithm>using nam原创 2021-06-10 16:01:42 · 138 阅读 · 0 评论 -
P2825 [HEOI2016/TJOI2016]游戏
思路是从左到右 从上到下 把 每一个连续的***XXX当作一个区域 然后 从上到下 从左到右 把 连续的 ***xxx当作一个区域 然后 区域对区域连边 跑最大流即可#include<iostream>#include<cstring>#include<algorithm>#include<queue>#define INF 0x3f3f3f3fusing namespace std;const int N = 2650,M = N * N原创 2021-05-27 20:31:53 · 586 阅读 · 1 评论 -
P3758 [TJOI2017]可乐
首先可以考虑 dp i j 表示 第 i % 2 次 j 能贡献多少次 路 那么转移式 可以为dp[i % 2][l] += dp[(i % 2) ^ 1][j]; 但是 显然 2e8超时了 。所以考虑别的方法 我们从贡献的值 想的话 每次 j 都是从与他有关的路 过来的 所以每个 j都可以从一个值过来 那么矩阵乘法可以实现 显然停留在自己城市的话 那么就自己再给自己即可 爆破了的话 是不能再参与下一次走路 所以 只有当前路 走到爆破#include<iostream>#include<原创 2021-05-26 20:00:10 · 77 阅读 · 0 评论 -
AISing Programming Contest 2021(AtCoder Beginner Contest 202) E - Count Descendants 思维 or 线段树合并
这道题苦思冥想 我也只会离线做法 但是离线会爆内存 所以看了手标称 标称写的真的秒 我大概就是给大家转述一下 标称的大意 就是存一个时间戳 表示从点 x 进去以及 从点 x出来是什么时候 然后记录一下从root点进去 深度为y的点 这个时候大家就可以明白了 只有当 深度为 y 且 比 x 点进去的时候 大 且比 从x 出来的点小的时候 才是 经过 点 x 的深度为y的个数 而求什么时候进去 什么时候 出来只需要用二分就足够了#include<iostream>#include<vec原创 2021-05-23 16:59:45 · 180 阅读 · 0 评论 -
洛谷p1315
一道贪心好题一开始思考 如何去暴力做这个题我们就想先把 k为0的时候求出来 然后 循环找最优那么就思考 用双for去寻找 当 这个k 给 第i条路氮气的时候 对 j的影响1.我们可以发现 当 到达 i的时候 如果人还没到齐 就是 车等人 那么 给氮气 还是车等人 所以 只会对 这个景点到 下个景点有影响 而不会对下下个景点有影响 并且只会对要下车的人有影响 因为 加快到达就会加快下车2.当到达 i 的时候 人已经到齐了 那么就是人等车 这个时候 给氮气 到的越快 那么到达下一个景点也会越快所以原创 2021-05-18 19:02:38 · 108 阅读 · 0 评论 -
P1667
首先我们没有一丝思路 = =al - 1 + S,al - S,ar - S,ar + SS就是Sr - Sl - 1 那么我们把al 这些都化成S的形式Sl - Sl - 1 - 1 +Sr - Sl - 1 …然后发现Sl - 1 和 Sr 调换了位置。。然后题目就变成了 调换位置 能否让序列变成递增序列 求最小调换次数。然后调换的话 就疯狂 和 自己循环节内的调换 就行 因为循环节 至少 有一对是刚好可以调换出来的#include<iostream>#include&l.原创 2021-05-04 21:56:42 · 97 阅读 · 0 评论