CF1600分以上训练
文章平均质量分 51
SundayJerry
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #748 (Div. 3)F. Red-Black Number(记忆化 + 标记数组优化剪枝)
F. Red-Black Number题意:给你一个n位的数字 让你把n位数分别染上红色或者黑色 染上红色的需要整除A个数记为r,染上黑色需要整除B个数记为b,让我们求abs(r - b)最小,2 <= n <= 40, 1 <= A,B <= 40思路:首先我们可以看到,有n位数字分成两半,那么我们一定可以想到暴力枚举所有方案就有2^n - 1种方案对吧,那么之后我们就可以想如何进行优化.对于染成红色的数之和记作flaga, 染成红色的数记作flagb, 那么我们可以看到对于原创 2021-10-17 13:25:51 · 217 阅读 · 0 评论 -
Codeforces Round #618 (Div. 2)E. Water Balance(单调队列 + 思维)
题目链接题意给你n个数,给你一种操作你可以选择一个区间,然后把这个区间的数变为(区间和)/(区间长度),之后让你求多次操作后字典序最小的数组a解法:1.如果当前的数字的数都是升序的,那么当前一定是字典序最小的,不需要操作直接输出.2.有一种类似andrew求凸包的方法,我们一开始维护出一个前缀和,之后我们求出1-n之间中,求出操作[l, r]能够使得a[l]变小的左端点l,最后在队列对答案进行求出即可#include<bits/stdc++.h>#define M 200009#d原创 2021-10-11 23:56:32 · 63 阅读 · 0 评论 -
Codeforces Round #618 (Div. 2)D. Aerodynamic(思维 + 几何)
题意:其实题意很长,一下子不太好理解,看懂了之后就好了,题目逆时针顺序给出一个凸多边形,定义一个P向量为(x,y),之将T定义为一组点,这些点是所有P(x,y)的并集,因此原点(0,0)位于P(x,y)(严格地说是在边界内和边界上,之后它又给出了一个相似其实上面很难看懂,我根本没看:),之后我就看懂了图,就是凸多边形的两个点和(0,0)组成的凸三角形是否相似,这里可以转化为当前的凸多边形是否为中心对称图形结论:中心对称图形有偶数个点,由于凸多边形是逆时针给出的点,直接求对称点的横坐标之和和纵坐标之和是否原创 2021-10-11 23:47:28 · 71 阅读 · 0 评论 -
Codeforces Round #618 (Div. 2)C. Anu Has a Function(思维 + 二进制)
题目链接题意给你n个数,之后定义一个函数f(x, y) = (x | y) - y,让你求f(f(…f(f(a1,a2),a3),…an−1),an)最大的a_1-a_n的顺序思路:其实我们可以发现f(x, y) = (x|y) - y可以等价于x - (x & y)即减去x和y二进制相同位的位置,那么我们可以很快的发现如果a_1-a_n结论:如果一个二进制位出现了大于1次,得到的最大值二进制1在这一位是一定不存在的,那么我们可以直接求出来最后的最大值,接下来就是调出a_1-a_n的顺序解法原创 2021-10-11 23:37:06 · 92 阅读 · 0 评论 -
CF1388D. Captain Flint and Treasure(拓扑排序+贪心)
原题链接对于这个问题,我们只需要考虑a[i]>=0的叠加到a[b[i]],因为a[i]加到a[b[i]]上,我们可以发现有向边考虑拓扑排序,对于a[i]大于等于0的直接叠加到a[b[i]],然后把a[i]<0的点直接存入即可#include<bits/stdc++.h>#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)#define ll long longusing namespace std;原创 2021-08-22 23:48:28 · 97 阅读 · 0 评论 -
CF1363E. Tree Shuffling(树形dp)
原题链接给你n个节点,根节点为1,第i个节点花费a_i,装入了数字b_i,它想要最后将数字c_i最后写入第i个节点。你有一种操作,就是使得u节点的子树的k个节点进行交换,产生的花费为k*a_u,求最小花费解法:考虑树形dp,题目已知1为根节点,我们可以从上往下遍历,维护一个a[i]的最小值,如果当前遍历节点的值a[i]为最小值,那么就是当前的进行修改花费是最少的,更新答案即可,注意一点更新完之后,1号节点还有剩余未匹配节点,说明无法进行交换输出-1#include<bits/stdc++.h&原创 2021-08-21 19:38:56 · 96 阅读 · 0 评论 -
CF1342E. Placing Rooks(容斥+组合数)
原题链接题意:n * n的棋盘有n个车,满足下面的条件1.棋盘上的每一个空格子至少能够被车走直线走到2.恰好存在k辆车互相攻击解法:1.对于第一个条件来说,我们只需要进行考虑行的,对于列的*2即可,对于k=0不考虑。2.首先我们每一个行都能够到了,所以确定了第一个条件,之后我们对于一个列放x对车,那么互相攻击就有x-1对了3.分析完1,2后,我们只需要把点放在n-k列中进行排列组合,对于放在n-k列中,答案总共有(n-k)^n,之后我们需要减去多余情况,利用容斥原理,之后我们减去多余空行为1的原创 2021-08-16 21:24:20 · 105 阅读 · 0 评论 -
CF1119E.Pavel and Triangles(简单贪心+策略)
原题描述题意:给你n种木棍,每种木棍的长度为2(i-1),之后会给出n个数表示长度为2(i-1)有多少根,对于每一根木棍我们只能用一次,我们需要求最多组成多少个三角形。解法:贪心,我们只需要选择当前长度相同的两个木棍,之后我们匹配比它长度小的进行匹配,之后我们在进行匹配当前长度的三个木棍,贪心策略。#include<bits/stdc++.h>#define ll long long #define pii pair<int,int>#define IOS ios::sy原创 2021-08-16 20:52:55 · 78 阅读 · 0 评论 -
CF474F.Ant colony(线段树+策略)
原题链接题意:给你n只蚂蚁,q个询问,对于询问来说,你可以任意选择一个区间[l,r],之后这里的蚂蚁就会相互之间作战,那么当ai和aj决斗时,如果ai能够被aj整除,那么ai的战斗点+1,当且仅当蚂蚁的战斗点为r-l的时候才不用被吃掉,让你求询问的区间,一共吃掉了多少个蚂蚁,样例:[1, 3, 2, 4 ,2]询问区间[1, 5]的时候它们分别的战斗点为[4, 0, 2, 0, 2]解法:一开始想到了区间gcd,但是考虑1的情况时候考虑了很久,之后考虑了如果区间的gcd等于最小值,说明现在最小值能够被原创 2021-08-13 16:11:17 · 98 阅读 · 0 评论 -
2B - The least round way(dp)
原题链接题意:从左上角走到右下角,经过路径的数字相乘得到的答案最少有多少个0解法:我们考虑生成0的有那种方法对于个位来说,我们发现只有2*5=10会产生0,那么我们就可以考虑维护到哪一个位置最少有多少个2和5,那么我们就可以维护一个三维dp,dp(i,j,k),i表示到了多少行,j表示到了多少列,k有0或 1,0表示当前有多少个2,1表示当前的状态有多少个5,特别注意,只要出现了0答案就是1,我们需要进行记录0的位置。之后,我们先跑一边O(n^2)的dp维护出dp(n-1,n-1,0)和dp(n-1原创 2021-08-13 10:19:26 · 91 阅读 · 0 评论 -
1400B - RPG Protagonist(暴力枚举)
原题链接原题题意就是一个主人和一个随从,主人能够拿p重量的重物,随从能够拿f重量的重物,现在有cnts把剑重量为s,cntw把战斧重量为w,那么我们最多可以携带多少把武器解法:我们只需要暴力枚举,然后加一点贪心即可,实际操作代码注释里面有哦!#include<bits/stdc++.h>#define ull unsigned long long#define sc scanf#define pr printf using namespace std;void solve(){原创 2021-08-13 00:30:13 · 136 阅读 · 0 评论 -
CF1305C. Kuroni and Impossible Calculation(暴力枚举)
原题链接题意:给你有n个数的数组,m为模数,让你计算下面的公式值∏1<=i<j<=n∣ai−aj∣(modm)\prod_{1<=i<j<=n}|ai - aj|(mod m)1<=i<j<=n∏∣ai−aj∣(modm)解法:对于这个题目(2 <= n <= 2e5)(1 <= m <= 1000),对于这个题目我们可以知道,对于上面这个公式,在这个1<=i<j<=n范围,|ai-aj|%m = |原创 2021-08-08 10:33:30 · 60 阅读 · 0 评论 -
1342C - Yet Another Counting Problem(暴力枚举)
原题链接题意:给你两个数a和b,q个询问,每个询问包括两个数l,r,对一个数x,l<=x<=r,x满足((x mod a) mod b)≠((x mod b)mod a),计算每一个询问解法:我们可以假设x = k1 * a + c,x = k2 * b + d那么如果((x mod a) mod b)=((x mod b)mod a)成立,c = d,那么x的表达式就可以表示为x = k*lcm(a,b) + e;其中e为max(a,b) - 1#include<bits/st原创 2021-08-07 23:46:24 · 330 阅读 · 0 评论 -
CF1349A. Orac and LCM(策略 + 维护后缀gcd)
题意:给你n个数,给你两种定义一个为gcd,lcm如:gcd({8,12}) =4, gcd({12,18,6})=6,lcm({4,6})=12.1.对于这个n个数我们定义一个集合t={lcm({ai,aj}) | i<j}2.之后我们要进行求解答案gcd({lcm({ai,aj}) | i<j})解法:我们可以把所有i相同的定义为一组,那么gcd({lcm{ai,ai+1…an}})那么对于i=1时gcd1 = gcd(lcm(a1,a2),lcm(a1,a3)…lcm(a1,a.原创 2021-08-07 22:54:53 · 141 阅读 · 0 评论 -
CF1334C. Circle of Monsters(贪心)
原题链接题意:给你n个怪物,每个怪物有ai点血,当怪物死亡以后对下一个怪物产生bi点伤害,每一次你可以开一枪对怪物产生一点伤害,求最小的操作数使得怪物全部死亡。解法:首先我们要想到一个贪心的思想,就是我们打的顺序是需要连续的,不然我们产生的bi伤害就会因此浪费导致答案变大。那么我们就可以枚举第一次打的位置,然后进行计算每一个位置对它之后进行产生的影响```cpp#include<bits/stdc++.h>#define sc scanf#define pr printf#def原创 2021-08-07 21:21:31 · 182 阅读 · 0 评论