
codeforces
stduy_ing
这个作者很懒,什么都没留下…
展开
-
Codeforces 1545 E. Number of Simple Paths (topo找环 + 计数)
链接: E. Number of Simple Paths题意:给一个 n 个点 n 条边 的联通图,求图中的路径数 (1 - 2 和 2 - 1算同一条路径)。思路:由于是 n 个点 n 条边,所以就是一棵树加了一条边,必定存在一个环,所以我们只需要找到这个环上的点,求出每个点有多少个儿子节点(每个点 dfs 一遍就好了),然后就是计数,如果两个点都在环上,或者属于两个不同的子树,那么两点间的路径数就是 2 ,如果属于同一子树路径数就是 1 .可以用 topo 找环,每次把度为 1 的点去除原创 2020-11-26 09:58:47 · 323 阅读 · 0 评论 -
Codeforces Round #673 (Div. 2) E. XOR Inverse (字典树 + 分治)
链接 E. XOR Inverse 题意:给一个数组 ,需要找到一个 X ,使数组中每个数 异或 X 后 ,数组中的逆序对数最少 ,如果有多个 X 找最小的那个,求 X和逆序对数。思路:比较两个数的大小 ,其实就是比较两个数的二进制位第一个大小不同的位置的大小,因为字典树可以保存相同的前缀,所以我们先用字典树把这些数字存起来,用 vector 存一下当前前缀相同相同的每个数的位置。考虑每个二进制位 , 因为我们已经记录了这一位为 0 和 1 的数的位置,所以可以直接求出逆序对数 , 这样我们就原创 2020-09-28 15:14:05 · 447 阅读 · 0 评论 -
Codeforces Round #673 (Div. 2) D. Make Them Equal ( 构造 ) + E. XOR Inverse (字典树)
链接: D. Make Them Equal题意:给一个长度为 n 的数组 , 每次操作 可以选择一个 i , j , k ,使ai = ai − x ⋅ i , aj : = aj + x ⋅ i。求最多 3 * n 次操作内使每个数都相等的操作方法 ,操作过程每个数都不能变为负数。思路:首先我们可以发现 对于 a[i] 这个数,我们可以给数组中的其他任何一个数加上任意的值 ,前提是 a[i] 足够大。所以我们可以先把其他的数都加到 a[1] 上去 , 再把它分配给其他的数。怎么把后面的值都原创 2020-09-28 14:48:33 · 329 阅读 · 0 评论 -
Codeforces Round #672 (Div. 2) D. Rescue Nibel! (差分 + 组合数)
链接: D. Rescue Nibel! 题意:有 n 栈灯 ,每栈灯在 [ l , r] 时间段内是开着的 ,现在需要选择 k 栈灯 ,使他们能在同一时间内打开 ,问有多少种选择方法 。思路:如果不考虑重复的情况 , 我们可以算出每个时间点 有多少盏灯亮着 ,然后用一个组合数就可以把答案算出来 ,但这样明显会有很多重复的情况 。 所以对于每个时间的点 , 我们只算开始时间在这个点的灯的贡献 , 所以需要在减去 开始时间都不在这个点的贡献 。我们可以先离散化一下,再用差分数组 统计每个时间点原创 2020-09-25 10:44:43 · 1049 阅读 · 0 评论 -
Codeforces 259 D. Little Elephant and Elections (数位dp +dfs 暴力)
链接: D. Little Elephant and Elections题意:从 1 到 m 选 7 个数,使得其中一个数中 数位4 7 的个数大于其他 6 个数中 数位4 7 的个数的和。思路:先用数位 dp 求出分别含 0 - 9 个 4 ,7 的数的个数。然后枚举第一个人选的 数中 4 7 的个数,再 dfs 枚举其他 6 个人选的数( 6 个人的和小于第一个人)。#include<iostream>#include<cstdio>#include<s原创 2020-08-08 19:07:04 · 234 阅读 · 0 评论 -
Codefoces Educational Codeforces Round 92 (Rated for Div. 2) B. Array Walk ( dp / 记忆化搜索 )
链接: B. Array Walk 题意:给一个数列 ,初始价值为 a[1],每次你可以选择向右走或者向左走,走完获得当前位置的数值,最多向左走 z 次,并且不能连续两次向左走,问走 k 步获得的最大价值。思路:dp [ i ][ j ] [ k ] 表示当前走第 i 步,已经向左走了 j 次,当前向左还是向右。然后直接转移就好了,如果当前向右,那上一步既可以向左也可以向右,如果当前向左,那上一步只能向右。还有当前位置为 i - 2 * j + 1.(1表示向左,0表示向右)dp[i][j][原创 2020-07-30 09:27:51 · 418 阅读 · 1 评论 -
Codeforce 787 D. Legacy ( 线段树优化建图 + 最短路)
链接: D. Legacy题意:一眼看上去是求最短路,但他给出的边权是,一个点到一个区间的边权(也就是说 u 到 【l,r】内的点都有一条边)。思路:因为区间内的点都是连续的,所以我们可以用线段树把这些连续的点缩成几个区间,把区间变成一个新的点,再让这个新点于原来的点之间连上权值为 0 的边,这样可以很大的降低复杂度。这个巨巨写得很详细 D. Legacy代码:#include <iostream>#include <cstdio>#include <map&原创 2020-07-29 16:30:45 · 459 阅读 · 0 评论 -
codeforces Codeforces Round #656 (Div. 3) E. Directing Edges (拓扑排序 )
链接: E. Directing Edges题意:给一个图,有的边方向没有确定,是否可以给这些边加上方向是其变成一个无环图。思路:先对有向的边进行拓扑排序,判断是否有环,如果有环就是 NO, 否则就让 拓扑序小的点指向拓扑序大的点(有向无环图一定是拓扑序小的指向大的)。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 2e5+7;const int mod=原创 2020-07-18 20:41:49 · 166 阅读 · 0 评论 -
Codeforces Round #656 (Div. 3) D a-Good String ( dfs )
链接: D a-Good String 题意:大概就是给一个长度为 2 ^ k 的字符串,要变成好的字符串,至少要改变多少个字符,好字符串的定义是 :左边或者右边 len /2 个为 a ,则另外一边的左边或右边一半为 b ,就这么递归下去(有点难表述,看了半天才看懂)。思路:dfs 枚举所有可能的情况 ,左边一半选当前字符还是右边一半取当前字符,计算出不同字符数,取较小的。代码:#include<stdio.h>#include<iostream>#include&原创 2020-07-18 09:45:20 · 247 阅读 · 0 评论