随笔分类 - cf
摘要:E - Addition on Segments 思路: dp dp[i]表示构成i的区间的右端点 先将询问按r排序 然后,对于每次询问,每次枚举 i 从 n-x 到 1,如果dp[i] >= l , 那么 dp[i+x] = max(dp[i+x], dp[j])
阅读全文
摘要:F - Isomorphic Strings 思路:字符串hash 对于每一个字母单独hash 对于一段区间,求出每个字母的hash值,然后排序,如果能匹配上,就说明在这段区间存在字母间的一一映射 代码:
阅读全文
摘要:E - Pencils and Boxes 思路: dp 先排个序,放进一个袋子里的显然是一段区间 定义状态:pos[i]表示小于等于i的可以作为(放进一个袋子里的)一段区间起点的离i最近的位置 显然,初始状态:pos[i] = 1,1 <= i <= k 状态转移: pos[i+1] = i+1
阅读全文
摘要:D - Sand Fortress 思路: 二分 有以下两种构造, 分别二分取个最小。 代码:
阅读全文
摘要:D - XOR-pyramid 思路: 区间dp dp[l][r]表示ƒ([l, r])的值 显然,状态转移方程为dp[l][r] = dp[l][r-1] ^ dp[l+1][r] 初始状态dp[i][i] = a[i] 可是,这道题求的是这段区间包含的某一连续区间的最大值 那么用差不多的转移方程
阅读全文
摘要:D - Kay and Snowflake 思路: 树的重心 利用重心的一个推论,树的重心必定在子树重心的连线上。 然后利用重心的性质,可知,如果有一颗子树的大小超过整棵树的大小的1/2,那么树的重心一定在这颗子树上。 利用以上两条,可知: 如果没有一颗子树的大小超过整棵树的大小的1/2,那么就可以
阅读全文
摘要:C3 - Encryption (hard) 思路: 记sum[i]表示0 - i 的和对 p 取模的值。 1.如果k * p > n,那么与C2的做法一致,O(k*p*n)复杂度低于1e8。 2.如果k * p <= n 那么根据抽屉原理,必有k个sum[i]相同, 那么任意取k - 1个相同的
阅读全文
摘要:C2 - Encryption (medium) 思路: 传统的dp: dp[i][j] 表示到第i个位置为止,分成j段的最大值 dp[i][j] = max(dp[l][j-1] + (sum[i] - sum[l]) % p) 0<= l < i 优化的dp: 我们发现n很大,但是p很小 于是
阅读全文
摘要:Worst Case 思路: 使 a <= b 当 a == b 时 或者 a == b - 1 时,答案显然为 2 * (a - 1) 否则找到最大的 c ,使得 c * c < a * b 如果 c * (c + 1) >= a * b ,那么可以构造 c - 1 + c 个 数对 ,减去 一个
阅读全文
摘要:961E - Tufurama 思路: 线段树或者分块 遍历 1 - n - 1,求 区间[i + 1, min(a[i], n)]大于等于 i 的个数,累加起来 线段树: 分块:
阅读全文
摘要:960F - Pathwalks 思路: ORZ 杜老师 用map写1e5个树状数组,骚操作 记Q为query和update次数,则节点个数约为Q*log(N) 代码:
阅读全文
摘要:960D - Full Binary Tree Queries 思路: 用move1[i]记录第i层第1种操作移动的个数(对这一层的个数取模) 用move2[i]记录第i层第2种操作移动的个数(对这一层的个数取模) 查询方法: 记当前值为 x,当前层为 i,则经过操作后,他到了 x + move1[
阅读全文
摘要:813E - Army Creation 思路: 线段树+二分 先预处理每个点往后走k步的下标 线段树二叉树的每个节点用vector维护这些下标,给这些下标排个序 询问区间L,R,那么把下标小于等于R的位置都减掉,因为只要后面连续k个就够了 代码:
阅读全文
摘要:946D - Timetable 思路: 分组背包 每组物品最多选1个 v[i]表示对于这天来说减掉i节课后最多能减少多少小时的在校时间 代码:
阅读全文
摘要:817F - MEX Queries 思路: 离线+离散化+线段树 代码:
阅读全文
摘要:931F - Teodor is not a liar! 思路: 最长上升子序列 先差分数组染色 如果存在一个点,被所有区间包含,那么这张图一定是山峰状,如下图: 那么只要分别从前和从后找一个最长非严格上升子序列,然后从前往后更新就可以找出最大的山峰序列的长度,这个就是答案 代码:
阅读全文
摘要:932D - Tree 思路: 树上倍增 anc[i][u]:u的2^i祖先 mx[i][u]:u到它的2^i祖先之间的最大值,不包括u pre[i][u]:以u开始的递增序列的2^i祖先 sum[i][u]:以u开始递增序列从u到2^i祖先的和,不包括u 代码:
阅读全文
摘要:939E - Maximize! 思路: 贪心:最后的集合是最大值+前k小个 因为平均值时关于k的凹形函数,所以可以用三分求最小值 又因为后面的k肯定比前面的k大,所以又可以双指针 三分: 双指针:
阅读全文
摘要:940E - Cashback 思路: dp+rmq 可以证明最后划分的区间可以由长度为1和长度为c的区间组成的,这样就可以用O(n)的dp求了,区间最小值随便拿什么维护都可以 状态:dp[i]表示到i这个位置为止的最小划分和 初始状态:dp[0]=0 目标状态:dp[n] 状态转移:dp[i]=m
阅读全文
摘要:937D - Sleepy Game 思路: dfs。 vis[u][0]==1表示u这个点能从s点偶数路径到达 vis[u][1]==1表示u这个点能从s点奇数路径到达 这个样就能保证dfs时每个点最多被访问2次 那么如果存在一个点u,vis[u][1]==1且u的出度为0,那么就存在能Win的方
阅读全文