![](https://img-blog.csdnimg.cn/20210726172103596.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
刷题
菜鸡刷题咕咕咕咕
yngcy
一只会咕咕咕的菜鸡。
展开
-
codeforeces1748C Zero-Sum Prefixes(贪心)
首先,不难想到修改的次数要最少;其次,对于一次修改,影响的是原数组的后缀。因此,根据贪心思想,可以找原数组非零段,用它前面的0修改成这段前缀和的值出现次数最多的那个数的相反数即可。原创 2022-11-15 11:14:14 · 262 阅读 · 2 评论 -
codeforces1670F Jee, You See?(DP/位运算/前缀和/组合数)
首先,对于 ,有sum=a1+a2+⋯+ansum = a_1 + a_2 + \cdots + a_nsum=a1+a2+⋯+an根据前缀的思想,所以得到 。于是问题转化为和为 的情况下异或和等于 的方案数。不难想到,当 的某位上为 111 时,说明这个位置上的 的个数为奇数,反之,则为偶数。定义 为前 位且第 位上 111 的剩余个数为 的方案数。定义状态转移方程为 ,其中 是当前位 111 的个数的最大值。于是可以理解为前 位且第 位上 111 的剩余个数为 的状原创 2022-06-14 03:07:32 · 336 阅读 · 0 评论 -
codeforces1631D Range and Partition(二分/思维)
题目链接:codeforces 1631D题目思路:y−xy-xy−x 越大,所选的区间长度越长,对应的分割后的个数越少,所以二分查找这个最小的差值。那么怎么保证划分后的每个区间的在 [x,y][x,y][x,y] 内的个数大于在 [x,y][x,y][x,y] 外的个数?不妨反过来想,如果都保证了,那么所有的在 [x,y][x,y][x,y] 内的个数一定大于在 [x,y][x, y][x,y] 范围外的个数。所以我们可以在写 check 函数的时候,只要考虑这个区间的最大个数与此时区间外的个数之差原创 2022-02-13 16:07:57 · 605 阅读 · 2 评论 -
codeforces1631E Paint the Middle(线性DP)
题目链接:codeforces 1631E题目思路:如果数字之间不影响,那么直接考虑贪心,每次选最长的区间,然后中间的改为 111。但是有可能中间的数字有可能是其他区间的端点。考虑用动态规划来解决。首先某个数字最后出现的位置一定是区间的右端点,用一个数组 pos 记录某个数字最后出现的位置。定义 dp[i] 为前 i 个 000 的个数。为什么是 000 的个数而不是 111 的个数呢?因为填 000 的位置是端点,转移的时候用端点比较好写方程。显然,第一个数一定是左端点,定义状态转移方程:dp[原创 2022-02-12 13:16:55 · 889 阅读 · 0 评论 -
2022牛客寒假训练营1-A(01背包/同余)
题目思路:首先有个结论:一个数的数字根是它对 999 取模的余数,特别的,如果余数为 000,则树根为 999。于是问题就转化为,求这 nnn 个数不同余数的方案数,用01背包即可。需要注意的有两点:因为是余数,所以根据同余的性质,直接让 a[i] 对 999 取模,缩小数据规模,方便后续转移;因为初始状态 dp[0][0] = 1 表示当前方案可行,所以要在最后计算 dp[n][0] 时减去 111。参考代码:#include <iostream>using namespa原创 2022-01-25 18:21:00 · 489 阅读 · 0 评论 -
codeforces1620E Replace the Numbers(并查集)
题目链接:codeforces 1620E题目思路:倒序遍历每次的操作,对于操作 222,相当于把 x 加入到代表元是 y 的集合。参考代码:#include<iostream>using namespace std;const int N = 5e5 + 10;int a[N], x[N], y[N], fa[N];int main () { int q, n = 0; cin >> q; for (int i = 1; i <= q; i++原创 2022-01-23 19:54:20 · 277 阅读 · 0 评论 -
codeforces1622C Set or Decrease(贪心)
题目链接:codeforces 1622C题目思路:贪心思想,显然,用最小的数去替换数组中的数。答案与顺序无关,不妨先从小到大排个序,假设替换了末 jjj 个数字,当前和为 sumsumsum。比较好想的是,如果当前 sum≤ksum \le ksum≤k,则答案就是最小的 jjj。如果 sum>ksum > ksum>k,则需要先减少最小的数再去替换。具体做法是:先尝试替换后 jjj 个数,求的差值 difdifdif,然后最后的次数加上 (dif+j)/(j+1)(dif+j)原创 2022-01-23 19:22:27 · 1067 阅读 · 2 评论 -
codeforces1622D Shuffle(组合/容斥)
题目链接:codeforces 1622D题目思路:暴力枚举区间 [l, r],每次考虑把边界上的 111 放在中间的方案数。用预处理的方法求组合数。参考代码:#include <iostream>#include <vector>#include <string>using namespace std;typedef long long ll;const int N =5000+10;const int mod = 998244353;ll n,原创 2022-01-23 18:53:52 · 548 阅读 · 0 评论 -
codeforces1627C Not Assigning(思维)
题目链接:codeforces 1627C题目思路:给一颗树的边赋值,单条边的权值为质数,相邻两条边的权值和也为质数。不难发现必然有一条边的权值是 222,与这条边相邻的边的权值是其他任意质数。所以,显然,如果存在可行解的的话,这颗树已经退化成一条链,即不可能有一个节点的度为 333。于是,只要找到这条链的一端,然后再去根据条件赋值即可。参考代码:#include <bits/stdc++.h>using namespace std;void solver(){ int原创 2022-01-16 19:15:47 · 620 阅读 · 0 评论 -
codeforces1624F Interacdive Problem(交互/二分)
题目链接:https://codeforces.com/problemset/problem/1624/F题目大意:已知 nnn,猜数字 xxx。对于每次询问:+ c:返回 $\lfloor \frac{x+c}{n} \rfloor $。题目思路:二分,每次加的 ccc 为到下一个 nknknk 所需的值,然后再去判断这个整数 kkk 与返回的 ppp 的大小,每次搜索后,保证 lll 是 nnn 的整数倍。参考代码:#include <iostream>using na原创 2022-01-14 09:33:18 · 215 阅读 · 0 评论 -
codeforces1625C Road Optimization(线性DP)
-原创 2022-01-13 20:48:02 · 343 阅读 · 0 评论 -
codeforces1621B Integers Shop(贪心)
题目链接:codeforces 1621B题目大意:有 n 个线段 [li,ri][l_i,r_i][li,ri],需要 cic_ici 的花费。特别的,如果选了两个不重合的线段,中间的点也会被选中。第 sss 天只有前 sss 个线段,求第 sss 天包含尽可能包含多的点所需要的花费,如果有多种方案,则求出最便宜的花费。题目思路:直接贪,显然,我们要选择当前的最小的左界和最大的右界,这个结果可能由一个线段贡献,也可能由两个线段贡献。取最小值即可。参考代码:#include <ios原创 2022-01-11 15:57:55 · 394 阅读 · 0 评论 -
codeforces1621D The Winter Hike(思维/贪心)
题目链接:codeforces 1621D题目思路:不难得出右下角的所有雪全清,接下来就是找到右上角到右下角的路径。关键是找到到右下角区域的入口。根据移动方式,再贪心只选择一个入口,画图可知只有八个入口,取最小值即可。参考代码:#include <iostream>using namespace std;typedef long long ll;const int maxn = 550;int n;ll a[maxn][maxn];void solver() { ll a原创 2022-01-08 19:36:54 · 495 阅读 · 0 评论 -
codeforces1620D Exact Change(贪心/枚举)
题目链接:codeforces1 1620D题目思路:根据贪心思想,先满足最大的那个数至多需要的面值为 333 的硬币数 curcurcur,然后再枚举面值为 111 和 222 的硬币数是否有可行解,答案取最小值即可。参考代码:#include <iostream>#include <algorithm>#include <vector>using namespace std;typedef long long ll;void solver() {原创 2022-01-04 12:16:58 · 412 阅读 · 0 评论 -
codeforces1623C Balanced Stone Heaps(二分/贪心)
题目链接:codeforces 1622C题目思路:二分答案,对最小高度二分。对于当前假设的高度 xxx,每次操作的时候,采取贪心策略,倒序枚举,把当前的石头数尽可能地放到前两堆。需要注意的是,如果当前堆石头数减少的数量一定是 000 或是333 的倍数。参考代码:#include <iostream>using namespace std;typedef long long ll;const int N = 2e5 + 10;ll n, mx;ll a[N], b[N];原创 2021-12-30 02:42:02 · 827 阅读 · 0 评论 -
codeforces1365E Maximum Subsequence Value(思维)
题目链接:codeforces1365E题目大意:给定一个序列,定义其非空子序列(大小为 kkk)的价值是每个元素的二进制数中第 i(i>=0)i(i>=0)i(i>=0) 位上 111 的个数如果大于 max(1,k−2)max(1, k-2)max(1,k−2),则 ans += 2^i,求最大的价值。题目思路:显然,当 k≤3k \le 3k≤3 时全选。当 k>3k>3k>3 时,每个位上需要的 111 也会增加。假设我们已经选了 333 个数,当选第原创 2021-12-13 00:36:35 · 812 阅读 · 0 评论 -
codeforces1445C Division(唯一分解定理)
题目链接:codeforces1445C Division题目思路:当 p<qp<qp<q 时,显然答案是 ppp;当 p≥qp\ge qp≥q 时,如果 p%q≠0p\%q \ne0p%q=0,显然答案是 ppp;当 p≥qp\ge qp≥q 时,且 p%q=0p\% q = 0p%q=0,想到唯一分解定理,把 ppp,qqq 拆成若干的素数相乘,当 ppp 减少若干个 qqq 的质因子,满足不能被 qqq 整除时即可得到我们要的答案。观察到 qqq 比较小,所以去找 qq原创 2021-11-29 13:23:53 · 251 阅读 · 0 评论 -
codeforces1427C The Hard Work of Paparazzi(最长上升子序列)
题目链接:codeforces1427C The Hard Work of Paparazzi题目思路:直接 O(n2)O(n^2)O(n2) 枚举。观察 rrr 比较小,当 i≥2∗ri \ge 2*ri≥2∗r 时,不用从头扫一遍,只要从 i−2∗ri-2*ri−2∗r 开始即可,用一个数组维护前 iii 个的最大值。参考代码:#include <iostream>#include <cstring>using namespace std;const int N =原创 2021-11-28 00:38:18 · 186 阅读 · 0 评论 -
codeforces1183F Topforces Strikes Back(约数/思维)
题目链接:codeforces1183F Topforces Strikes Back题目思路:分情况讨论,选一个数,一定是选最大的那个数,假设是 x1x_1x1。选两个数,再选的这个数一定是最大的不是 x1x_1x1 的约数的数,假设是 x2x_2x2。证明:假设当前两个数是 aaa,bbb。如果其中有一个是 x1x_1x1 的约数,则用 x1x_1x1 替换这个数。如果两个都不是 x1x_1x1 的约数,则用 x1x_1x1 替换 min(a,b)min(a,原创 2021-11-27 01:01:52 · 357 阅读 · 0 评论 -
codeforces1183H Subsequences (hard version)(线性DP)
题目链接:codeforces1183H Subsequences (hard version)题目思路:求前 kkk 长的子序列。定义dp[i][j] 为前 iii 个长度为 jjj 的子序列个数,首先将 dp[i-1][j] 的状态转移到 dp[i][j],再加上不包含当前 s[i] 的子序列个数,即 dp[i-1][j-1]。又因为前面可能会有 s[last] 与 s[i] 相等,我们只要减去 dp[last-1][j-1] 即可,last 是在 iii 前面离 iii 最近的相等字符的下标。参原创 2021-11-26 18:42:06 · 512 阅读 · 0 评论 -
codeforces1433G Reducing Delivery Cost(最短路)
题目链接:codeforces 1433G思路:首先预处理在没有免费边情况下的最短路,再暴力枚举边即可。假设当先线路为 j,对于边 (a, b) ,它有两种情况:免费后不在最短路上,结果是 f[j.first][j.second]。免费后在最短路上,因为这条边的价值改变了,可能最短路会变,所以要讨论,结果是 min(f[j.second][a]+f[j.first][b], f[j.first][a]+f[j.second][b])。时间复杂度为 O(m∗k+n∗m∗logn)O(m*k+原创 2021-11-11 18:22:02 · 277 阅读 · 0 评论 -
codeforces1581C Portal(线性DP/前缀和)
题目链接:codeforces 1581C思路:定义 dp[i] 为前 i−1i-1i−1 列最小的花费。枚举时先枚举上下边,在对列 DP。因为第 kkk 列可能是边界,也可能在后面的过程中变成中间的部分,所以每次单独计算,而不算在 dp[i] 里面。参考代码:#include <iostream>#include <cstring>using namespace std;const int N = 550;int maze[N][N];int tot0[N][N]原创 2021-11-09 11:52:00 · 272 阅读 · 0 评论 -
codeforces1603A Di-visible Confusion(思维)
题目链接:codeforces1603A题目思路:从头开始删数字,对于每个数字 aia_iai,如果它不能被 222 ~ i+1i+1i+1 的数整除,说明它可以被删除。参考代码:#include <iosrteam>using namespace std;const int N = 1e5 + 10;int a[N];int n;int main() { cin >> n; for (int i = 1; i <= n; i++) cin原创 2021-11-02 08:06:27 · 138 阅读 · 0 评论 -
codeforces1228C Primes and Multiplication(快速幂/唯一分解定理)
题目链接:codeforces 1228C题目思路:f(x,y)f(x, y)f(x,y) 是所有 xxx 的质因子在 yyy 中出现次数的乘积,题目要求 111~nnn 的乘积,故对于每个质因子,统计其出现次数,再求乘积即可。参考代码:#include <iostream>using namespace std;typedef long long ll;const int mod = 1e9 + 7;const int N = 1e5 + 10;int prime[N];i原创 2021-10-27 02:19:23 · 78 阅读 · 0 评论 -
codeforces1486D Max Median(二分/思维)
题目链接:codeforces 1486D题目思路:二分中位数,每次将大于等于 mid 的数标记为 111,否则标记为 −1-1−1。我们要找到一个长度为 k 的区间,枚举右端点,每次只要找到一个左端点,使区间 [l,r][l, r][l,r] 的和大于 000(因为中位数是向下取整,故不能取到等号),用前缀和维护即可。因为是在区间 [1,r][1, r][1,r] 寻找左端点,且区间是连续的,故维护最小的前缀和,只要这个区间和大于 000 满足条件即可。参考代码:#include <iost原创 2021-10-25 01:27:29 · 139 阅读 · 0 评论 -
codeforces837D Round Subset(数学/背包DP)
题目链接:codeforces 837D题目思路:要求结果的 000 最多,不难想到这个数的因子 222 和 555 的个数尽可能多。故将每个数分解,然后就是一个比较简单的背包问题。参考代码:#include <iostream>#include <cstring>using namespace std;typedef long long ll;const int N = 220;int cnt2[N], cnt5[N];int dp[N][5010]; // 前原创 2021-10-23 05:51:08 · 120 阅读 · 0 评论 -
codeforces1119D Frets On Fire(差分/前缀和/二分)
题目链接:codeforces 1119D题目思路:数据这么大一定是找规律……求区间里数的个数,与顺序无关,不妨先排个序。不难发现当 a[i]+r>=a[i+1]−la[i]+r >= a[i+1]-la[i]+r>=a[i+1]−l 时,就会又重叠的部分。于是想到差分,并对差分数组排序,用前缀和维护前面有重叠的部分。二分查找有重叠和未重叠的分界,即第一个大于等于 len 的下标。参考代码:#include <iostream>#include <algorit原创 2021-10-19 02:20:28 · 147 阅读 · 0 评论 -
codeforces1188C Array Beauty(DP/前缀和)
雀食是DP好题,DP玄学优化呜呜。题目链接:codeforces 1188C题目思路:美丽值与顺序无关,故对数组排序,子序列的美丽值就是所有相邻数的差值的最小值。设美丽值为 xxx 的子序列个数为 cnt[x],那么美丽值为1的子序列个数为 cnt[1],它对答案的贡献为 cnt[1]*1,相似的,美丽值为2的子序列对答案的贡献为 cnt[2]*2,差值的最大值为 10510^5105,故最后的答案为:ans=∑i=1105cnt[i]∗ians=\sum_{i = 1}^{10^5}cnt[i原创 2021-10-18 01:20:25 · 120 阅读 · 0 评论 -
codeforces1199C MP3(离散化/前缀和/二分)
题目链接:codeforces 1199C题目思路: 将 a[1…n]a[1…n]a[1…n] 离散化,前缀和维护区间个数。枚举区间起点,二分查找终点,取最大值。参考代码:#include <iostream>#include <map>#include <algorithm>#include <cstring>#include <cmath>using namespace std;typedef long long ll;co原创 2021-10-16 17:18:37 · 83 阅读 · 0 评论 -
codeforce1519D Maximum Sum of Products(区间DP)
题目链接:codeforces 1519D题目思路:区间 dp /记忆化深搜,定义dp[i][j]为翻转区间 [l,r][l,r][l,r] 的前后差值。状态转移方程为dp[l][r] = dfs(l+1, r-1) + a[r] * b[l] + a[l] * b[r] - a[l] * b[l] - a[r] * b[r]。参考代码:#include <iostream>#include <cstring>using namespace std;typedef lo原创 2021-10-16 01:32:17 · 130 阅读 · 0 评论 -
codeforces1041D Glider(二分/前缀和/贪心)
题目链接:codeforces 1041D题目思路:显然,为了尽可能覆盖多的区间,起点一定是某段区间的左端点,故枚举左端点,二分查找终点,下降的高度用前缀和记录即可。具体参见代码。参考代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 2e5 + 10;int n, h;struct Node{ int x1, x2;}node[N];int pre[N]原创 2021-10-15 02:11:55 · 76 阅读 · 0 评论 -
codeforces1370D Odd-Even Subsequence(二分/思维)
题目链接:codeforces 1370D题目思路:二分答案,每次check构造两个序列,枚举答案 x 是从奇数中取得还是偶数中取得。取两个序列长度的最大值 len,即只要有一个序列长度满足条件 len >= k,说明长度还可以再短,答案还可以更小。参考代码:#include <iostream>using namespace std;const int N = 2e5 + 10;int a[N];int n, k;bool check(int x, int len1 =原创 2021-10-12 03:42:51 · 69 阅读 · 0 评论 -
codeforces1260D A Game with Traps(二分/差分)
题目链接:codeforces 1260D题目思路:求尽可能多的人数,在规定时间内到那目的地,对人数进行二分即可,并且每次带的人敏捷值尽可能高。假设当前人数为 xxx,最低的敏捷值为 yyy。如何求得当前所要花费的最少时间呢?可以用一个差分数组标记,然后通过前缀和计算时间。具体参见代码。参考代码:#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 10;struct Node { int l, r,原创 2021-10-09 03:22:44 · 95 阅读 · 0 评论 -
NWERC2020 A Atomic Engery(贪心/背包/鸽巢原理)
题目链接:NEWRC2020 A题目描述:给你 nnn 个原子,第 iii 个原子有 iii 个中子,以及由 aia_iai 的能量。接下来由 qqq 次询问,每次输入一个 kkk,表示有 kkk 个中子的原子。若 k≤nk \le nk≤n,则释放对应原子的能量 a[k]a[k]a[k];若 k>nk > nk>n 则会分裂成若干原子,每次分裂只会分裂出两个原子,分裂后只有满足 k>nk > nk>n 的原子会继续分裂,以此类推,使分裂后的每个原子的中子数小于 n.原创 2021-09-09 22:03:04 · 302 阅读 · 0 评论 -
HDU6979 Photoshop Layers(前缀和)
题目链接:HDU6979 Photoshop Layers题目描述:给你 n 个图层,自底向上编号从 111 到 nnn。图层的混合方式有两种,若 m=1m=1m=1,则在之前的图层用当前图层覆盖, 即 Rn=Ri,Gn=Ri,Bn=BiR_n = R_i, G_n=R_i,B_n=B_iRn=Ri,Gn=Ri,Bn=Bi;若 m=2m=2m=2,则在之前的图层上叠加当前层,即 Rn=min(Rp+Ri,255),GN=min(Gp+Gi,255),Bn=min(Bp+Bi,255)R_n原创 2021-08-03 20:38:12 · 117 阅读 · 0 评论 -
HDU6976 Game on Plane(思维/贪心)
题目链接:HDU6976题目描述:Alice 和 Bob 玩一个游戏,有 nnn 条直线在 2D 平面上。Alice 先选择其中的 kkk 条直线,然后 Bob 画一条直线 LLL。Bob 的花费是这条直线 LLL 与 kkk 条直线相交的直线的个数。现在,Alice 想要尽可能的使这个花费大,而 Bob 要使这个花费尽可能小。在双方都采取最有策略的情况下,求 k=1,2,……,nk = 1,2,……,nk=1,2,……,n 时的花费。输入数据的格式为,第一行输入测试样例组数。原创 2021-08-01 00:35:53 · 244 阅读 · 0 评论 -
HDU6968 I love exam(哈希/线性DP)
比赛时没看出来是背包,还以为是可反悔贪心……补题时看std状态转移方程也看的人麻……原来我还在门外,或者已经入土了……题目链接:HDU6968 I love exam题目描述:ZZZ 有 nnn 门科目需要考试,而 ZZZ 所有科目都初始分数为 000。但有 mmm 套复习资料,对于复习资料 iii,它可以提高对应课程 xix_ixi 的分数(最多提高到 100100100),需要花费 yiy_iyi 天,且每套复习资料是一次性的。现在距离考试还有 ttt 天,在允许最多挂原创 2021-07-28 17:59:38 · 242 阅读 · 0 评论 -
HDU6954 Minimum spanning tree(线性筛/贪心)
题目链接:HDU6954题目描述:给定 n−1n-1n−1 个点,编号从 222 到 nnn,边的权值是两个点的最小公倍数。求最小的生成树总权值。输入格式为,第一行输入测试样例组数 TTT。对于每组测试样例,输入一个整数 nnn。其中,2≤n≤1072\le n\le10^72≤n≤107。题目解析:贪心,每条边权重最小,从而使得生成树的权值最小。显然,合数与它的质因子相连时,权值为该合数的值,对于质数,我们只要与最小的质数 2 相连即可。用线性筛筛出质数,然后用前缀和维护即可。参考代码原创 2021-07-24 00:45:04 · 190 阅读 · 0 评论 -
HDU6957 Maximal submatrix(DP/悬线法)
题目链接:HDU6957 Maximal submatrix题目描述: 给定一个 n∗mn*mn∗m 的矩阵,求面积最大的子矩阵,对于该矩阵,满足每列元素是个非递减序列。 输入数据格式为,第一行输入测试样例组数 TTT。每组数据首先输入两个整数 nnn 和 mmm,表示矩阵的大小。接下来 nnn 行,每行输入 mmm 个整数 vijv_{ij}vij,表示第 iii 行 第 jjj 列的元素。其中,1≤n,m≤2∗1031\le n,m原创 2021-07-23 14:58:40 · 155 阅读 · 0 评论 -
HDU6950 Mod, Or and Everything(思维/数学)
题目链接:HDU6950题目描述:给定一个整数 nnn,你需要计算 (n%1)∣(n%2)∣⋯∣(n%(n−1))∣(n%n)(n\%1)|(n\%2)|\cdots|(n\%(n-1))|(n\%n)(n%1)∣(n%2)∣⋯∣(n%(n−1))∣(n%n) 的值。输入数据格式为,第一行输入测试样例组数 TTT,对于每组测试数据,每行输入一个整数 nnn。其中,1≤n≤10121\le n\le10^{12}1≤n≤1012。输出数据格式为,对于每组测试数据,输出一个整数,表示计算结果。题目解原创 2021-07-24 00:40:22 · 156 阅读 · 0 评论