![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
2020末CF康复训练
issue是fw
19 years old, struggling in life, chasing daydreams.
展开
-
CF688div2 1453 B. Suffix Operations(思维,构造)
题意给定数组aaa,每次可以把后缀加一或减一,问最少操作次数而且,你有一次改变某个aia_iai的机会,可以改成任意数字先考虑不改变某个aia_iai时的答案由于最后所有数字都要变成一样,所以当后n−1n-1n−1个数字变得和a1a_1a1一样时就不需要操作了证明如果后n−1n-1n−1个数字不是变成a1a_1a1,对[1,n][1,n][1,n]同时加减多少次也无法满足条件那么让[2,n][2,n][2,n]的数字都变成a1a_1a1,前提是[3,n][3,n][3,n]的数都变原创 2020-12-05 00:15:11 · 791 阅读 · 3 评论 -
CF688div2 1453 C. Triangles(枚举+贪心)
由于一定有一条边是平行xxx轴或yyy轴的那就枚举这条平行边,也就是枚举每一行每一列设当前求数字kkk构成的三角形第iii列最左边的数字kkk在第minnminnminn列,最右边的数字kkk在第maxxmaxxmaxx列那么平行边长是maxx−minnmaxx-minnmaxx−minn,那么让高最高可以改变第111行某个格子变成数字kkk,也可以说第nnn行所以此时最大三角形面积是(maxx−minn)∗max(i−1,n−i)(maxx-minn)*max(i-1,n-i)(maxx−mi原创 2020-12-04 23:53:29 · 393 阅读 · 1 评论 -
CF688div2 1453D. Checkpoints(期望递推构造)
题意构造一串长nnn的零一序列(n<=2000)(n<=2000)(n<=2000)有12\frac{1}{2}21的概率成功通过第iii个关卡如果失败,立刻返回小于等于iii的最小的111位置观察发现如果单独一个111,穿过去的期望步数是222如果要算也很简单,设穿过一个单独的111的期望是xxx有12\frac{1}{2}21的概率一步穿过,12\frac{1}{2}21的概率一步失败,还需要期望xxx通过那么x=12∗1+12∗(x+1)x=\frac{1}{2原创 2020-12-04 23:32:11 · 1437 阅读 · 9 评论 -
CF1457 D. XOR-gun(猜结论题)
传送门首先造成不递增,必定是存在一个iii为中介点有[l,i][l,i][l,i]的异或大于[i+1,r][i+1,r][i+1,r]的异或但这么去枚举TTT上天但是发现如果相邻三个数最高位一相同那么后两个数的异或值一定比前面小而这些数字只有303030位二进制,所以当n>60n>60n>60直接输出111就好了…太菜了害…#include <bits/stdc++.h>using namespace std;const int maxn = 2e5+10;原创 2020-12-01 00:11:00 · 308 阅读 · 0 评论 -
1455D. Sequence and Swaps(思维)
这个好像思维难度蛮低的…因为不论怎么交换xxx的值,只要进去换了,必定会有一个原数组aaa内的元素出来由于nnn不大我们果断枚举那个出来的元素,然后把xxx加入进去那么对这个新的数组bbb排序现在的任务就是如果把aaa数组变成bbb然后注意到xxx的交换条件是ai>xa_i>xai>x所以必然是从前往后判断,若ai==bia_i==b_iai==bi忽略就行若ai!=bia_i!=b_iai!=bi必定要交换xxx和aia_iai此时需要满足ai>xa_i原创 2020-11-30 23:37:30 · 816 阅读 · 0 评论 -
HDU3830 Checkers(思维隐式建图+数学lca)
传送门题意给定三元组(x,y,z)(x,y,z)(x,y,z)每次可以从x,y,zx,y,zx,y,z任选一个作为对称轴,其余数字可以根据这个对称轴跳到另一侧规则是不能跨越两个数字给你两个三元组,判断最短操作步数.分析\color{Red}分析分析这题思路是真的隐蔽…首先对于三元组(x,y,z)(x,y,z)(x,y,z)首先yyy可以跳到xxx左侧,也可以跳跃到zzz右侧,这是毫无疑问的然后,当y−x<z−yy-x<z-yy−x<z−y时,xxx可以跳到yyy右边,因原创 2020-11-30 22:27:25 · 262 阅读 · 0 评论 -
1413D. Shurikens(贪心,栈)
传送门就是每次取出的元素,如果把它放在最近一次放入物品的位置按照栈式匹配上一次拿出去了xxx那么栈内所有元素的值都应该大于xxx这就是一个递减的序列,就可以满足要求#include <bits/stdc++.h>using namespace std;const int maxn = 2e5+10;int n,a[maxn],ans[maxn];int stac[maxn],top,num,flag = 1;int wt[maxn],laz[maxn];int main(原创 2020-11-28 10:40:03 · 376 阅读 · 1 评论 -
1280A - Cut and Paste(模拟)
传送门观察发现xxx不大,应该可以直接模拟而且光标最多移动到xxx位置,意味着只需要知道[1,x][1,x][1,x]的字符是什么就可以了所以先模拟到xxx位置,然后就直接计算长度即可很无语的题目(不过作为div1Adiv1Adiv1A也一般般八…)#include <bits/stdc++.h>using namespace std;#define int long longconst int maxn = 3e6+10;const int mod = 1e9+7;char原创 2020-11-28 10:17:02 · 290 阅读 · 0 评论 -
1422 C. Bargain(推式子数学)
传送门本来是非常简单的一题…一步想错步步想错…很明显需要枚举每个数字来计算贡献比如考虑第iii位数字的贡献第一部分\color{Red}第一部分第一部分若删除[i+1,n][i+1,n][i+1,n]间的子串,删去长度为jjj的,还剩下n−i−jn-i-jn−i−j贡献是a[i]∗∑j=1n−i(n−i−j+1)∗10n−i−ja[i]*\sum\limits_{j=1}^{n-i}(n-i-j+1)*10^{n-i-j}a[i]∗j=1∑n−i(n−i−j+1)∗10n−i−j发现n−i原创 2020-11-27 21:12:24 · 307 阅读 · 0 评论 -
1454F. Array Partition(思维....二分)
传送门开始想错了方向…害其实很简单,直接暴力枚举xxx然后区间扩张的话,最大值不减,最小值不加,这就有单调性那么可以得到[1,x][1,x][1,x]的最大值klklkl那么在区间[x+1,n−1][x+1,n-1][x+1,n−1]去二分一个x+yx+yx+y使得[x+1,x+y][x+1,x+y][x+1,x+y]的最小值等于klklkl当最小值等于klklkl时,就根据[x+y+1,n][x+y+1,n][x+y+1,n]的区间最大值去二分总之就是双二分…维护区间最值这里用的线段树,实原创 2020-11-27 10:44:49 · 332 阅读 · 0 评论 -
1029E.Tree with Small Distances(经典树dp)
传送门观察发现一定是从111连出来的边最划算而且连到一个点之后,这个点周围的所有点都是满足要求的.定义f[u][1]f[u][1]f[u][1]为和111有连边f[u][2]f[u][2]f[u][2]为通过父亲到111f[u][3]f[u][3]f[u][3]为通过儿子到111那么f[u][1]=∑vmin(f[v][1],f[v][2],f[v][3])f[u][1]=\sum\limits_{v}min(f[v][1],f[v][2],f[v][3])f[u][1]=v∑min(f[v]原创 2020-11-26 20:19:27 · 366 阅读 · 0 评论 -
CF 1420D. Rescue Nibel!(枚举点计算组合数)
传送门快要被自己菜哭了不管怎么算都会有重复可以把所有区间的2n2n2n个点存下来枚举‘枚举当前能覆盖到点xxx的线段个数然后如果在这个点新加入了一条线段,就可以去前面找k−1k-1k−1条线段覆盖这个点而且自己也覆盖这个点由于自己是新加入的,所以不可能和前面的方案重复#include <bits/stdc++.h>using namespace std;#define int long longconst int mod = 998244353;const int max原创 2020-11-26 14:05:17 · 243 阅读 · 0 评论 -
CF 1430D. String Deletion(思维,模拟)
传送门观察操作的规则可以发现若一个相同的块长111,那么不管是操作一还是操作二都会消耗掉若一个相同块长lenlenlen,操作一可以消耗lenlenlen次,而操作二还是一次消耗掉.那么贪心规则就出来了我们每次都去找下一个块长大于111的去进行操作一然后操作二就直接模拟取最前面的块扔掉就好了如果之后已经没有块长大于111的了,那没办法,只能一次一次来#include <bits/stdc++.h>using namespace std;const int maxn=2e5+1原创 2020-11-26 11:52:38 · 271 阅读 · 0 评论 -
CF 1437C. Chef Monocarp(简单费用流或dp)
传送门一眼看过去,裸的费用流把每个时刻拆成一个点,每个菜品作为一个点每个时刻连向每个菜品,费用为对应的费用源点连向每个时刻,每个菜品连向汇点.当然所有流量都是111,为了保证所有东西只能使用一次跑一个最小费用最大流即可.#include <bits/stdc++.h>using namespace std;const int maxn = 4e5+10;const int inf = 1e9;struct edge{ int to,nxt,w,flow;}d[maxn]原创 2020-11-26 11:09:23 · 298 阅读 · 0 评论 -
1442B.B. Identify the Operations(思维题。。。。)
传送门设aaa数组为a1 a2 a3 a4 a5a_1\ a_2\ a_3\ a_4\ a_5a1 a2 a3 a4 a5设想现在需要添加a3a_3a3,那么可以删除a2a_2a2,也可以删除a4a_4a4删除a2a_2a2后,a3a_3a3代替a2a_2a2靠近了a1a_1a1下次如果需要添加a1a_1a1,同样可以删掉a3a_3a3对于数字a1a_1a1而言,情况并没有发生任何变化同原创 2020-11-25 22:09:40 · 304 阅读 · 0 评论 -
1442AA. Extreme Subtraction(贪心思维或差分)
传送门题意给定一个数组,每次可以把一个前缀的数全部减一,或者把一个后缀全部减一问最后有没有可能让所有数都变成000代劳们的神仙差分思路考虑差分数组ans[i]ans[i]ans[i].如果所有数变成零,那么最后ansansans一定也是零对于操作一,就是ans[1]−−,ans[i+1]++ans[1]- -,ans[i+1]++ans[1]−−,ans[i+1]++对于操作二,就是ans[i]−−,ans[n+1]++ans[i]--,ans[n+1]++ans[i]−−,ans[n+1]原创 2020-11-25 21:14:21 · 309 阅读 · 0 评论 -
CF1446B. Catching Cheaters(最长上升子序列变形)
传送门大意了啊,没有闪…发现其实无论如何都无法避免计算lcslcslcs这一段…然后觉得是dp....dp....dp....但是不会做定义f[i][j]f[i][j]f[i][j]为以aaa串iii和bbb串jjj结尾的最大贡献值那么当a[i]!=b[j]a[i]!=b[j]a[i]!=b[j]时f[i][j]=max(0,max(f[i−1][j],f[i][j−1])−1)f[i][j]=max(0,max(f[i-1][j],f[i][j-1])-1)f[i][j]=max(0,max(原创 2020-11-25 19:42:42 · 328 阅读 · 0 评论