05 2022 档案

摘要:注意求的是子数组,所以把原数组按每段递增划分,一段的贡献就是 len * (len + 1) / 2. 这样分块,求前缀和就能O1的求出一段区间的不讲子数组个数。 ll f( int l, int r ) { if( id[l] == id[r] ) { return cal( l, r); } r 阅读全文
posted @ 2022-05-31 16:58 qingyanng 阅读(31) 评论(0) 推荐(0)
摘要:http://oj.daimayuan.top/problem/884 f[i] 表示以a[i]结尾的最长上升子序列,cnt[i]表示以a[i]结尾的最长上升子序列的个数。 可以n方转移: f[i] = max(f[j] + 1, f[i]); cnt[i] += cnt[j] | (f[i] == 阅读全文
posted @ 2022-05-19 11:44 qingyanng 阅读(257) 评论(0) 推荐(0)
摘要:https://codeforces.com/gym/103107/problem/E 题意: 给出n个字符串si,求最长字符串的序列S, S满足 对所有的i从1到n-1, si 是si+1的子串。 思路: si的子串就是si的一些前缀的后缀(经典套路),也就是在字典树上si的祖宗的fail树的祖宗 阅读全文
posted @ 2022-05-18 22:34 qingyanng 阅读(71) 评论(0) 推荐(0)
摘要:https://www.luogu.com.cn/problem/P2473 倒推 f[i][S] 表示1到i-1关拿的物品集合为S,从i到最后的期望 不知道下一关出现的是哪种物品,所以当前的期望是下一步所有情况的最优决策乘 1/k。 #include<bits/stdc++.h> using na 阅读全文
posted @ 2022-05-17 17:15 qingyanng 阅读(23) 评论(0) 推荐(0)
摘要:f[i][l] 表示前i个元素,选l个,且当前位置选的最大值。 f[i][l]从f[j][l - 1]转移, i - k ⇐ j < i,用单调队列优化 不能有f[i][l] ←- f[i- 1][l] 这样没法控制每k个选一个 所以初始还要把f赋-1,f[0][0] = 0 #include<bi 阅读全文
posted @ 2022-05-17 11:57 qingyanng 阅读(37) 评论(0) 推荐(0)
摘要:题意 : 给出一个有向图,无重边自环。 选择一段包含k个点的路径,问路径上的最大值最小是多少。 思路: 二分答案,转化为判定性问题。 On的判断,可以想到从入度为0的点搜,更新一个dist数组,遇到大于二分的答案x的点v,dist[v] = 0,出现dist大于k的点就判对。处理环:入度仍然不为0的 阅读全文
posted @ 2022-05-15 10:28 qingyanng 阅读(57) 评论(0) 推荐(0)
摘要:前缀和问题,考虑字典树 由于字典树的存储结构,从上到下贪心是不行的 但是可以从下往上:当前这个子树的大小小于等于k就不管它,等着上面一块处理,大于k就依次减去最大的子树,剩余的sz等着上面一块处理。 #include<bits/stdc++.h> using namespace std; #defi 阅读全文
posted @ 2022-05-12 10:58 qingyanng 阅读(50) 评论(0) 推荐(0)
摘要:https://codeforces.com/gym/103443/problem/F 扫描线核心思想就是从下到上暴力跑一维,把另一维的线段化为两个点处理,若处理两个点的线段的时间复杂度是log,这样平面上n个矩形,值域为X,Y的问题,能够在nXlogn(Y)的复杂度内处理 离散化 暴力一个一个点的 阅读全文
posted @ 2022-05-08 17:17 qingyanng 阅读(67) 评论(0) 推荐(0)
摘要:三角形来源于两直线相交生成两个三角形 共有三种线 可以构造使得一种线与另外两种线相交 答案就是 2*(A * B + A * C + B * C); 根号n的边就能造出n个三角形,二分找答案 int cal(int x) { int z = x / 3; //第一种 x -= z; int y = 阅读全文
posted @ 2022-05-07 17:15 qingyanng 阅读(26) 评论(0) 推荐(0)
摘要:https://www.luogu.com.cn/problem/P1850 因为是无向边,所以正着倒着做期望都行。 定义上到第i节课,精准交了j次申请,当前交没交申请的最小期望时间 f[i][j][0 / 1] 期望题的dp转移,不同决策间取min,一个决策包含了这个决策下的所有可能 一定要和背包 阅读全文
posted @ 2022-05-06 16:59 qingyanng 阅读(23) 评论(0) 推荐(0)
摘要:https://www.luogu.com.cn/problem/P4137?contestId=68990 若知道所有数字最后出现的位置,对于查询区间[l, r], num最后出现的位置pos小于l的话,则[l,r]一定不含num,pos大于r的话,就不知道了。 使用主席树,对于区间[l,r]查询 阅读全文
posted @ 2022-05-05 21:57 qingyanng 阅读(44) 评论(0) 推荐(0)
摘要:前置知识: 二项式定理 杨辉三角 第n行第m个数为C n-1, m-1 把前缀和 化成卷积的形式: 这时一个斜着的杨辉三角 现在我们知道了两种情况下b[i]的系数,因为是组合数,k超级大,所以递推出每一个bi. #include<bits/stdc++.h> using namespace std; 阅读全文
posted @ 2022-05-03 21:41 qingyanng 阅读(33) 评论(0) 推荐(0)
摘要:https://ac.nowcoder.com/acm/contest/11188/D 划分问题有时候适用隔板法 要求对称的1相等,我们做dp来划分状态 全0的时候直接算每个位置放不放隔板,放边上等价全不放, 偶数个奇数时候,还要计算中间的0的全零的方案 101 #include<bits/stdc 阅读全文
posted @ 2022-05-03 17:45 qingyanng 阅读(30) 评论(0) 推荐(0)
摘要:问题转化为从A,B两组中分别取相同个数的东西的某一权值总和的最取次数 fa/b[i][j][v] 表示前i个数,取j个,能否凑成体积v,f值就是0/1 注意控制合法状态,最后的枚举不要超过A,B的值域 #include<bits/stdc++.h> //#include <bits/extc++.h 阅读全文
posted @ 2022-05-03 10:23 qingyanng 阅读(146) 评论(0) 推荐(0)
摘要:要输出方案,很容易想到把方案放到dp值。 但这样我们dp需要记录余数,还要给数字排列 看到D的范围范围会想到状压,让dp的一维表示D个数字的使用情况。这样就可以用状压来得到数字的排列。 比如: 状压的 1000 就是第一个数字放到最高位,0100 是第二个数字放到最高位。 时间复杂度是 D * K 阅读全文
posted @ 2022-05-02 16:11 qingyanng 阅读(374) 评论(0) 推荐(0)