CodeForces部分题解
Anxdada
多读书多看报, 少吃零食多睡觉
展开
-
AIM Tech Round 4 (Div. 2) B, C 题解
传送门 B : 给你一个n*m的01矩阵, 问有多少种选矩阵位置的方式使得所在位置属于同一行或同一列, 且颜色相同(即数字相同)那么是很简单的一道水题. 直接是组合数, 那么直接求有点麻烦, 还要先去打组合数的表. 所以直接利用二进制枚举的思想, 直接有多少个直接是2的多少次方. 然后减去0 (都不选)的情况就行了. 记得最后减去多加的就行.AC Codeconst int maxn = 1e2+原创 2017-09-24 21:09:32 · 891 阅读 · 0 评论 -
CF 161 (Div. 2) D 题 Cycle in Graph 【dfs找环】
传送门 // 题意: 给定一个无向图, 任意找到这个图中的一个环, 并且环上的点数>=k+1.思路: 就是直接从任意一个点开始dfs点找环就是了, 如果遇到一个访问过的点那么就一定是一个环 , 我们就直接取出来就行啦.AC Codeconst int maxn = 1e5+5;int dfn[maxn], ans[maxn];int dfs_cnt, st, ed;int原创 2018-01-16 16:02:25 · 444 阅读 · 0 评论 -
CF EDU 36 Almost Acyclic Graph 【dfs判环】
传送门 // 题意 : 给定一副有向图, 问是否能通过最多删去一条边使得这个图无环. (好题!!!, 因为它与强连通有点不一样~~~)// 思路: 当然最暴力的做法就是标记每一条边然后去判断这个图是否还存在环. 但是这样的复杂度为O(m(n+m)) 这显然是不行的, 所以我们应该限制下边的数量, 也就是我们只取图中的任意一个环, 记录下它的边的编号, 然后暴力判断这些边的情况, 这样对于一个环原创 2018-01-17 16:14:04 · 490 阅读 · 0 评论 -
Hello 2018 A - D 题解
传送门 A, B水题就不说了.C: 类型 i 的瓶子体积是 2^(i-1),并给出每个瓶子的价钱, 问要得到至少L体积的水最少需要多少钱首先我们要考虑的就是得到这个i瓶子体积中的水最少需要多少钱. 所以我们前后扫一遍便可得出, 此时我们就有对于每个体积的水我们有了其最少的钱, 那么我们就可以贪心的从大的开始取, 一定是最优的, 然而此时有种情况就是此时瓶子的水直接大于L了, 那么我们取ceil(L原创 2018-01-10 20:12:16 · 184 阅读 · 0 评论 -
CF Round #461 (Div. 2) A - D题解
传送门 A: 这是一个坑题, 情况必须要想全面. 题意: 初始有一个原始玩具 , 每次可以扔一个原始玩具进机器可以额外获得一个原始玩具和一个复制玩具, 每次可以扔一个复制玩具可以额外获得二个复制玩具. 给定x个复制玩具和y个原始玩具, 问是否可以得到. 很明显就是要去判断下x - y + 1的奇偶即可, 但是特殊情况要考虑完全, 首先要保证这个是>=0的, 其次y 不能等于0, y = 1时原创 2018-02-14 01:53:10 · 301 阅读 · 0 评论 -
CF EDU 37 A - C, E - G 题解
传送门 A: 有n个地方, 其中有k个水龙头, 水龙头每秒可以向两边扩展1格, 问把n个地方都浇了至少需要多少秒.直接暴力算每个需要的最小值, 然后取这些的max值即可.AC Codeconst int maxn = 2e2+5;int a[maxn], vis[maxn];void solve(){ int n, k; Fill(vis, 0); sc...原创 2018-02-03 18:54:51 · 355 阅读 · 0 评论 -
CF EDU 39 B - D 题解
传送门 B: 题意: 给定两个数, 然后按给的三个步骤一直执行, 输出最后他们的值…那么减的话, 有可能减完了还是它的两倍, 所以我们直接取mod就OK啦…. 然后循环下去就行啦.. AC Codevoid solve(){ ll a, b; while(cin >> a >> b) { while(a &&...原创 2018-03-08 20:53:59 · 260 阅读 · 0 评论 -
CF EDU 38 A - D 题解
传送门 A: 给定一个字符串, 如果有连续两个的元音的话, 删去后面那个, 然后剩下的连接重复此操作. 输出最后的字符串, (注意: 这个的元音加了一个字母 y).直接按照题意模拟就行啦. AC Codeint vis[maxn];void solve() { string s; int n; vis['a'] = 1; vis['e'] = 1; vis['i'] = 1;原创 2018-02-24 20:33:02 · 277 阅读 · 0 评论 -
CF 355 div2 C, D 题解 【很好的两道脑洞题】
传送门 C: 给定一个n的n个数的一个排列, 每次操作可以将一个数放在序列的最前面或者最后面, 问把这个序列变成1 2 3….n 的这样一个排列.思路: 我们首先必须要看出一个事实, 那就是我们每次选择一些不在对应位置上的的这些数按顺序的放前面或者放后面使得最后这个序列都是我们要的这个序列,那么要最少, 我们就要找一个最长上升加一子序列, 那么我们要这些不动, 剩下全部按照顺序的放一定可以得到,原创 2018-03-11 17:16:25 · 422 阅读 · 0 评论 -
CF Round #468 Div. 2 B World Cup 【思维】
传送门 // 这道题就很水的, 但是比赛那天卡了我半小时… 所以就算4题排名还是靠后…. 所以就想单独写写这个题解…. 就是给定n个人, 两两pk, 胜者进入下一轮, 问给定的两个编号最多可以在第多少轮遇到.原先想的一步一步模拟, 但是非常难写, 实际上很简单, 因为n一定是2的幂, 然后每次让这两个编号+1/2即是打完一场比赛了, 如果他们相等了就表示遇到了塞…. 所以我杂这么菜?….A原创 2018-03-05 13:49:12 · 267 阅读 · 0 评论 -
CF 470 div2 B - D 题解.
传送门 B: 题意: 两个人轮流玩游戏, 首先有一个x0 >= 3, 然后A先手,第 i 轮每个人选择一个小于X(i-1)的素数然后算出这个素数的倍数并且离x(i-1)最近的那个数作为xi, 现在给定x2,问最小的x0是多少.思路: 首先我们可以通过算出x2的素因子得出x1的范围, 因为要范围尽量的大, 也就是包含的情况尽量的多, 那么肯定选择最大素因子, 对于一个数N, 最大素因子为P(N原创 2018-03-12 19:09:51 · 298 阅读 · 0 评论 -
CF469 div2 D 题 找规律
传送门 // 题意: 按照题目的意思进行模拟, 最后有q次询问, 每次询问第x个位置上的元素是谁…思路: (其实看这个n的范围就知道是找规律, 然后在一看q2e5多半就是qlogn的复杂度,所以尽量往折半上面想)首先奇数位置上面的数字就不用说了, 他们不会动的, 就是初始的数即(p+1)/2, 那么对应偶数上的位置了? 我们写几个看一看.. n=3 1 3 2 n=原创 2018-03-12 19:32:31 · 375 阅读 · 0 评论 -
CodeForces - 789D Weird journey 【思维 + 欧拉路径计数】
传送门 // 题意: 一幅(n, m)无向图, 问这幅图中有多少条路径满足经过m-2条路径2次, 剩余两条路径一次. 思路:首先我们要进行题意转换, 假设把所有的边都变成两条, 那么在任意去除两条路, 问题就变成是否剩下的路径是否可以构成一笔画问题, 也就是是否是欧拉路径, 即假想所有边变成两条后去掉两条边的方案数. 所以无向图的欧拉路径的充要条件为奇度个数为0或2. 所以我们分类讨论下, 边分为原创 2018-03-20 20:44:03 · 319 阅读 · 0 评论 -
CF EDU 40 C, D, G 题解 【思维,图论,二分】
传送门 C: 题意: 已知该人的旅游路线,编号的规则为 Ai, j = y(i - 1) + j,让你求是否存在某个矩阵的满足路线,不懂的可以看下样例1思路: 对于相邻的两个数之间的间隔一定是1 或者 y, 所以我们只需要管y不用管x, 那么我们直接check所有的间隔是不是y就是了, 注意一个坑点就是如果y == 3, 那么3 4 是不符合题意的, 即我们算出y后还要for一遍check出这种原创 2018-03-24 21:47:29 · 250 阅读 · 0 评论 -
CodeForces - 797C Minimal string 【贪心 + 后缀处理】
传送门 // 题意: 给定一个字符串, 每次可以进行两种操作, 一种是将s的头部字符取出来给t,另一种是将t的尾部字符取出来给u, 问最后使得s, t为空, u字典序最小的u是多少.思路: 很明显我们肯定是贪心的让越小的先进u即可,除此之外, 我们还要保存下t, 我们其实不要想太复杂, 影响此时我们是从t中取还是继续从s中取的一个原因就是如果s后面还有比当前t的尾部字符小的就要继续从s中取, 因为原创 2018-03-21 14:25:53 · 358 阅读 · 0 评论 -
VK Cup 2018 Round 2 div2 C, D 题解 【思维题】
传送门 C: 给定n个严格递增的数, 要从中选择三个数, 再满足下标i< j < k, 且a[k] - a[i] <= U, 的两个限制下,问可以使这个a[k]-a[j]/a[k]-a[i]最大是多少.思路:就是一道很简单的水题,只不过要进行一定的小推导, 首先我们要知道的是如果确定了i, k, 那么很明显j = i + 1; 因为这样才能使a[j] 最小, 即分子a[k]-a[j]越大, 所以我原创 2018-03-26 11:51:17 · 545 阅读 · 1 评论 -
CF EDU 41 D 题 Pair Of Lines 【经典几何题】
传送门 题意: 给定n个二维平面上的点, 问这些点是否存在于两条直线上.. (如果还对题意比较迷, 那就再说一种那就是所有点共线时也是YES)思路: 首先, 如果点数<3, 很明显是YES, 所以当点数大于3时我们只需要对前面三个点进行判断就是了, 假设以第一个点和第二个点确定一条直线, 此时我们先把在这条直线上的点先去除, 然后判断剩下的点是否能构成另一条直线即可, 如果不仅能再去判断第一个和第原创 2018-04-08 20:05:33 · 355 阅读 · 0 评论 -
CF 460 div2 D 题 Substring 【拓扑序 + dp】
传送门 // 给定一幅有向图, 每个点上有一个字母, 定义一条路径的长度为该路径上的点的字母出现次数最多的那个字母次数, 现在问你最长的路径长度是多少.// 思路: 很明显的拓扑序, 有一个问题就是到了一个点后我们要求出到该点的所有路径中26个字母中出现的最大次数并保存下来, 也就是我们设dp[i][j] 代表到i这个点时j字母出现的次数最大是多少. 每次到一个点后就维护下这些信息. 每次推原创 2018-02-01 00:12:41 · 323 阅读 · 0 评论 -
CF 451 div2 A - E 题解
传送门 // 因为各种原因, 有很多场cf没打了, 所以最近都在补cf,全程自己补, 只是少了比赛的紧张气氛而已. A: 直接做, 判中点void solve(){ int n; while(~scanf("%d",&n) ) { if (n % 10 <= 5) cout << n - n%10 << endl; else cout << n原创 2018-01-07 19:52:39 · 344 阅读 · 0 评论 -
CF EDU 36 C 题 Permute Digits 【dfs】
传送门 // 给定两个数字, a, b, 重排a的数位, 使得其最接近于b, 但是不能超过b, 输出这个a. // 那么直接的想法就是dfs深搜答案, 然后从高位贪心的选大的dfs搜索就行, 那么只要搜出了答案, 那么答案一定是最优的, 也就是可以直接退出程序了.AC Codeconst int maxn = 20+5;int vis[maxn];ll shu[maxn];ll a, b;原创 2018-01-15 22:51:31 · 277 阅读 · 0 评论 -
Codeforces Round #430 (Div. 2) C , D 题 题解
传送门 C: 给一颗树, 有点权. 然后输出每一个点的beauty值, 代表从根节点1开始到该节点, 所有点权的gcd. 并且每一条路你可以把某个点的点权变成0. 从而使得beauty值变大, 最后输出所有节点的最大的beauty值. 思路: 考虑到每个数最多的因子数是√n, 不断求gcd是很快降到1的, 所以直接暴力求每一种情况, 而某个节点的父亲的可能的值不会很多. 然后直接暴力求. 细节原创 2017-09-24 21:20:34 · 253 阅读 · 0 评论 -
Codeforces Round #433 div2 C,D 题 题解
CF – 835A 传送门 //题意: 给定n,k. 重新安排一个时间表, 范围是(k+1,k+n), 你需要计算的是一个新的时刻表, 使得res = (第一个时间 -1)*a[1] + (第二个时间 -2)*a[2] + … 要最小. a[1] - a[n] 是题目中给出的. //思路: 也是比较简单的一道题, 我们贪心的选择对于输入的cost越大的, 我们就从(k+1, k+n)中选出原创 2017-09-08 16:27:46 · 322 阅读 · 0 评论 -
Codeforces Round #434 div2 A, B , C,D 题 题解
传送门 A题: 给出n和k. 求一个数是n的倍数且末尾最少包含k个零 思路: 刚开始的时候没啥思路, 然后枚举1-1e8暴力过去的. 后面一想不就是求个lcm?赛后补了一发. 所以CFA题是很简单, 看你能想到不….void solve(){ ll n,k; while(~scanf("%lld%lld",&n,&k)){ ll m = 1;原创 2017-09-18 14:17:37 · 709 阅读 · 0 评论 -
Codeforces Round #435 (Div. 2) B, C 题解
传送门 B: 给定一棵树, 问最多可以加多少条边, 使得这幅图还是一个二分图. (二分图定义为对于任意一条边, 它的连个端点来自于不同的集合) 思路: 既然是二分图, 那么肯定想到染色, 对于处于深度进行染色成为二分图. 然后答案就是两个集合的点数相乘再减去(n-1). 意思上每两个点之间都可以有一条边, 然而原图中已经存在n-1条边了. 所以可以加的边数就是这么多.AC Codeconst i原创 2017-09-20 19:21:20 · 335 阅读 · 0 评论 -
codeforces 877 problem E Danil and a Part-time Job 【dfs序 + 线段树区间异或修改】
传送门 //题意: 给定一颗有根(1 )树,树上每一个点起始都有一个值(0或1),然后有两个操作,pow x把以 x为根的子树全部异或1, get x输出以x为根的子树中有多少个1. //思路: 就是一个最裸的dfs序 + 线段树异或修改的,细节请看代码. 注意就是求一个区间中的1,那么就是区间长度-此时区间的值, 然后就是修改下lazy标记处就是了. 还有就是线段树中是dfs序的一些线段,所以原创 2017-11-06 15:11:51 · 520 阅读 · 0 评论 -
CF #contest894 B,C 题题解
题目传送门 B: 题意:就是给一个n*m的矩阵, 然后可以在这个矩阵上填数字, 使得每一行和每一列乘起来都等于k(1 , -1) ,输出方法数% 1e9+7,因为k的特属于 正解: 每一行和每一列的最后一个空格留下来 改变这一行或者这一列的状态,其他所有的空格都是可以随意放的 所以就有 2^((n-1)*(m-1))的情况 另外注意 当 k == -1 时 假设所有的空格都放置 -1 如果 n原创 2017-11-21 19:56:08 · 298 阅读 · 0 评论 -
CF #890 D 题 【图论 + 思维】
传送门 //题意: 构造一个尽量短的字符串, 使得给出的n个字符串在构造的那个串中出现的次数是最多的(即这n个字符串出现的次数是一样的) //其实通过观察可以发现, 这个字符串中每个字母最多只能出现一次, 如果有两次的那么这个单个字母构成的字符串就是最多的了。其次, 我们还可以发现这些字母之间的顺序时固定的, 即一些字母一定在一些字母的前面, 所以我们就可以想到用拓扑序的方法, 把这些字母全部连原创 2017-11-16 19:22:29 · 342 阅读 · 0 评论 -
CF contest 888 problem E 【思维 + 状压 + 中途相遇法(折半搜索)】
传送门 //这道题和LA 2965非常像,不过更简单一点, //题意就是从n个数中选取一些数使得他们加起来 % m 尽可能的大, 很容易有一种想法就是二进制枚举, 但是2^35次方非常大 , 所以我们需要用到中途相遇法, 即我们二进制枚举前一部分, 把所有可能的和存起来, 然后再二进制枚举后一部分, 对于后一部分每一个我们枚举出来的和, 在前面二分找出离和当前和相加最大并不超过m-1的数(原创 2017-11-26 00:16:24 · 407 阅读 · 0 评论 -
CFEDU 35 A - D 题解
传送门A: 求最小的元素相隔的距离最小是多少. 记录最小值的位置, 扫一遍就行啦. AC Codeconst int maxn = 1e5+5;int cas=1;int a[maxn];void solve(){ int n ; while(cin >> n){ int mi = inf; for (int i = 1 ; i<= n ;原创 2018-01-11 11:01:04 · 287 阅读 · 0 评论 -
CF 455 Div. 2 A - E 题解
传送门 A: 从给定的两个字符串中各取一个前缀组合起来为ans, 求ans的最小字典序是多少.我们可以发现一定只从后面的字符串只取一个字符, 因为多取并不会使答案更优, 所以我们要做的就是在第一个字符串中不断的取比后面第一个字符小的字符为止.AC Codevoid solve(){ string a, b; while(cin >> a >> b) { strin原创 2018-01-11 22:12:39 · 295 阅读 · 0 评论 -
Codeforces Round #453 (Div. 2) C 题 Hashing Trees
传送门 // 题意: 给定一颗树的高度h, 在给定h+1个数字, 代表每一层上面的节点数, 问是否只有一颗树满足这个序列, 如果是输出perfect , 否则输出ambiguous,并任意给出两组满足这个序列的树的形态. 两棵树同构的概念是如果对于每一个序列中的数它对应的父节点都是一样的, 那么这两棵树同构.// 思路: 首先判断是否是有一棵树满足这个序列, 从样例二我们就可以很清楚的看出来, 从原创 2018-01-12 14:45:01 · 334 阅读 · 0 评论 -
CF EDU 34 C 题 Boxes Packing 【思维】
传送门 // 题意: 给定n个盒子的大小, 是有当一个盒子要个小于另一个盒子时, 它才能被另一个盒子装下, 问最后还剩几个盒子. 被装进一个盒子的算剩一个.// 思路: 主要考虑这个样例1 1 1 2 3 3 4 答案应该是3, 实际上我们可以将n个盒子排序后统计好每一个大小的盒子的数量, 然后从大的开始往下面扫, 如果遇到一个盒子的数量大于了从上面下来的盒子数量, 那么答案应该加上多余出来的数原创 2018-01-14 13:16:19 · 458 阅读 · 0 评论 -
CF 457 div2 A - C 题解
传送门 A: 给定一个Jamie必须醒的时间, 和一个x分钟间隔, 表示每x分钟闹铃就会响一次, 并且如果一个时间中包含7那么这个时间就是幸运的, 现在叫你求一个幸运的时间到达给定的那个时间, Jamie关闭闹铃的最少次数.直接模拟做就是了, 每次减x分钟, 若分钟减成负的了就加上一个60, 并让小时减, 小时减成负的了就加上24就行啦.AC Codebool ok(int x) { w原创 2018-01-22 23:59:26 · 464 阅读 · 0 评论 -
CF contest 892 D题 Gluttony
传送门 //题意:对于给定的一个长度为n的a序列, 重排a序列构造一个b序列, 使得b序列中任意一个连续区间中的和 (sum) 和 原先a序列对应的区间的和(sum) 不相等(除去全体的前缀和). //思路:因为题目中给的是n个不同的数, 所以首先一定有解, 那么如何构造了, 我么可以假设一个序列 1 2 3 4 5 那么如何重构b序列了, 我们可以发现每一个数我们可以选择一个比它小的数相原创 2017-11-19 20:57:19 · 454 阅读 · 1 评论 -
CF 456 div2 A,B,D,E 题解
传送门 A题: 水题直接做(注意爆int就是了)B题: 注意看清楚题目是选不超过k个, 所以就很简单啦. 直接分情况讨论, k == 1时就输出n, k >= 2时就输出n的二进制位数全为1的那个数. (注意不要使用log2来计算, 会被卡精度! 比如二进制为58个1的那个数log2出来就等于58!) AC Codevoid solve(){ ll n,k; while(ci原创 2018-01-06 18:59:28 · 530 阅读 · 0 评论 -
CF 452 A - D 题解
传送门 A: 给定n个1, 2的数, 问组成3的方式有多少种直接做 AC Codeconst int maxn = 2e5+5;int a[maxn];void solve(){ int n; while(cin >> n) { int c1 = 0, c2 = 0; for (int i = 1 ; i <= n ; i++)原创 2018-01-14 13:20:05 · 250 阅读 · 0 评论 -
Codeforces Global Round 1 E 题【思维】
传送门题意: 给定n个数的两个数组, c数组和t数组, 每次可以选择一个i(1 &lt; i &lt; n) 使得c[i] = c[i+1] + c[i-1] - c[i]; 问能不能再进行若干次这样的操作后使得c数组变成t数组.思路: 问题的解决点就是变换等式, C[i] = C[i+1] + C[i-1] - C{i], 假设变换后的为C2[i], 那么稍作转换可发现C2[i] - C[i...原创 2019-02-27 20:37:32 · 196 阅读 · 0 评论