- 博客(41)
- 收藏
- 关注
原创 ABC361 题解
显然如果把数列排序,一定从头或从尾删最快,剩余的一定是一个区间。我的 Atcoder 账号是 Eric_Cui,直接找就可以了。给一个类似华容道的游戏,可以把相邻的两个棋子放入宽为。注意到三个坐标独立,所以考虑对于三个坐标分别求交。注意转移时要考虑这个点以及后面的点是不是空。的空里,求起始状态到终止状态的最小步数。对于 B 来说有些难,感觉 B > C。,也可以跑一遍再输出的时候加入。给两个长方体,求它们有没有交。,不等式解集的交是好算的。给出一个数列,可以删除。大水题,但是样例更水。求树上哈密尔顿路径。
2024-07-07 09:21:46 924
原创 P3647 题解
当存在多个这样的连通块时,如图 2,建树时节点一定会组成单一的连通块,因为。,因为没有边上的限制,所以可以任意取,对于是中点的情况,可以再加上边权。注意到方程里仍有大量之前可以利用的内容,所以需要维护最大值和次大值。:所有的蓝边都可以在某一个根上表现出形如。构成了单独的连通块,因为如果不是,那么。的蓝边时,可以证明不存在这样的边。是否为蓝边终点的子树最大边权和。的转移方程,我们照样也可以推出。如图,当存在形如 1 的情况时,枚举树根,对每个根 DP。所产生的蓝边对都提取出来。的转移方程,留给读者思考。
2024-02-08 23:29:55 1021
原创 P4824 Censoring 与 KMP模板 题解
给定字符串s和t,求s中子串为t的个数及所有起始位置。特别的,对于每个i,还要给出1i区间内,满足以下条件的j1≤jisubstr1jsubstri−j1i。
2023-08-06 23:08:13 122
原创 P2915 Mixed Up Cows 题解
这题一眼,最多绿题,恶评。:给定一个长度为n的数列a和常数ki∈x∣x∈2n∩Z∣ai−ai−1∣k其中,n≤16。
2023-07-28 22:42:20 53
原创 CF1401D 题解
Problem Quality: Good, not very interesting (3/3→33/3\to33/3→3)Main section/category: Trees, GreedyDifficulty: 180018001800 official, 165016501650 personal.This problem is from 1401, a division two contest. The place of D is, however, an overestimate on
2023-03-29 14:32:30 82
原创 ABC 253 题解
ABC253 题解这场还是偏水。A既然是中位数,那么就只需判定 bbb 是否夹在 aaa 和 ccc 之间。就是这样:a <= b && b <= c || a >= b && b >= cB暴力。直接将第一个 o 和第二个 o 得到就行了。然后求曼哈顿距离:d=∣x0−x1∣+∣y0−y1∣d = |x_0 - x_1| + |y_0 - y_1|d=∣x0−x1∣+∣y0−y1∣。int h, w;cin >>
2022-05-28 21:46:01 393
原创 CF1675F 题解
CF1675F 题解这道题其实不难,CF 给它估的 180018001800,过高了。解法贪心。一个重要的结论:同一子树内的节点必须连续访问。证明:假设先访问其它节点的子树。设 did_idi 为节点 iii 的深度,设 lca(u,v)\text{lca}(u,v)lca(u,v) 为节点 uuu 和 vvv 的 LCA。不妨考虑连续三个节点的距离总和,设它们为 x,y,zx,y,zx,y,z。不难得到,距离总和为 dx+2dy−2dlca(x,y)−2dlca(y,z)d_{x}+2
2022-05-19 22:13:08 233
原创 CF1579E2 题解
CF1579 E2 题解题意大意:有一个双端队列,开始为空。给出 nnn 个数,要在队列的前方或后方插入。问最后队列的逆序对最小是多少。不难发现一个贪心策略:在哪里插入新增的逆序对更少就往哪里插。证明如下:考虑在某一个点中,选择逆序对更多的插入。因为后面的数是在前面和末尾插入的,所以不影响后面的任何逆序对数量。而此处逆序对只能更多,所以原策略最优。求新增逆序对数目很简单。扫一下队列里的数,如果 ai<xa_i < xai<x 那么插入在前面的逆序对数量增加,
2022-04-24 21:52:38 80
原创 CF778A 题解
Idea我们知道,这里的子串可以是不连续的!所以,删的字符少了没有任何问题。所以我们可以二分。我们二分的 ttt 就是答案。我们知道要从序列 aaa 取出一个前缀。所以,它的后缀一定是没有删除的。于是,我们往一个 vector 里面扔 ttt 到 nnn 的后缀,排序,就得到了保留的序列。再和目标字符串 ppp 一一比对,就可以了。Code:#include <bits/stdc++.h>using namespace std;string s, p;int a[200000
2021-08-24 10:38:21 178
原创 P1159 题解
贪心。好的这道题人家说是模拟?策略将 UP 的放在最后。DOWN 的放在最前。SAME 的不变。是不是很简单?证明我们先把 SAME 忽略(反正它是确定的)。对于第 111 个和第 nnn 个,我们知道,第一个一定是 UP,最后的一定是 DOWN。于是,对于所有的名字,一定会有一个可能的原来的位置。然后就是证明了。我们以 UP 为例。易得知,向下是肯定行的,因为每一块都向下移了几个。不可能最后被堵住了。DOWN 呢?设第 iii 个 DOWN 的位置为 aia_iai,那么一
2021-08-13 11:29:06 123
原创 CF1234 B2 题解
CF1234 B2 题解好的这道题应该太水了没有人看 Orz。介绍一下 STL queue。queuequeue<type A> q 代表队列。这种东西有两种操作:插入。在 STL 中表示为 q.push(x)。删除。在 STL 中表示为 q.pop()。这是一种先进先出的数据结构。就比如食堂打饭(都烂掉了这例子……),队首的人打完就走,后面的人从队尾进入。这就是队列。所以,这里要用到 queue 是因为,进来时是在顶端,末端删除。然后怎么判重?我们需要用到 map。m
2021-08-11 18:52:01 94
原创 CF1006B 题解
CF1006B 题解水。Q:首先,如果不考虑最大,怎么办?A:我们就把 kkk 个最大的数分别放在 kkk 个序列中,就行了。Q:那么这 kkk 个数位置都是不相同的,那么不就是每一个序列带着一些比它小的而已吗?A:好的被膜拜的人不是我!(逃所以,我们只要将这个序列排序,找 kkk 大的数,记录它们的位置。设 aia_iai 为它从 111 开始标号的位置。然后,对于 1<i<k1 < i < k1<i<k,我们都可以得出,长度为 ai−ai−1a_i
2021-08-10 15:00:31 145
原创 ABC 213 题解
ABC 213 题解这场比赛出的比较良心 QAQAXOR 在 C++ 中代表异或,可以用 ^ 表示。XORaaa 和 bbb 异或是这样的:首先,把 aaa 和 bbb 转换成 222 进制。高位补 000。将它们逐位比较,相同的为假,不相同为真。再转 101010 进制。它的一个重要特性是:交换。详细来说,是这样的:void swap(int &a, int &b){ a = a ^ b; b = a ^ b; a = a
2021-08-08 22:39:47 411
原创 CF1538F 题解
这道题巨佬们都是用数位 dp 来做的……好的我们来考虑一下当一个数 +1+1+1 时变化的位数。0+1=10+1=10+1=1,变化为 1119+1=109+1=109+1=10,变化为 22299+1=10099+1=10099+1=100,变化为 333显然,进位后有多少 000,就会改变零的个数 +1+1+1 个数位。显然,对于每两个正整数 nnn 和 mmm,在 nnn 以内能被 mmm 整除的数的个数为 nm\displaystyle{\frac{n}{m}}mn。所以,我们只
2021-08-06 14:29:15 175
原创 线段树学习笔记 中
GSSGSS 系列都是询问题,我们先来看看第一题 GSS1。GSS1题意给你一个长度为 nnn 的数列 aaa,一共 mmm 次询问。每次询问有两个数 lll 和 rrr,输出子序列 [l,r][l, r][l,r] 的最大子段和。解法线段树。可是,怎么做是个难点。可以分类讨论一下,就出来了:我们考虑每个区间的总和,最大前缀和,后缀和,子段和。我们考虑前缀和。显然,最大前缀和有两种情况:左子树的前缀和。左子树的总和 + 右子树的最大前缀和。类似,后缀和也有对应
2021-08-04 17:12:28 21
原创 CF1486A
首先,为了让这个序列为一个严格递增的序列,我们得让前面的数严格递增的情况下让后面的数尽可能大。这样就更有可能形成严格递增的样子了。比如 1000 1000 1000,我们可以把它变成 0 1 2999。我们把这个序列前面的数变的最小,让最后一个数尽可能大。这样,如果还是不行,就像 0 0 1 0 一样,那么就不行,因为 0 0 1 0 只能变成 0 0 0 1,而它不是严格递增的。或者说,只要一个数不满足要求就输出 NO,反之亦然。比如 0 0 1 0,到第二个数时就不行了,前两个数只能变成 0 0 (因为
2021-08-03 20:54:17 101
原创 CF1547C
贪心。我们先开一个答案序列。显然,一开始两个序列里有 000 就肯定先用上(但是要保证顺序,不能先用中间的再用前面的),从原先数组删除,插入答案序列,因为我们想要让行数越大越好,才能应对后面的数。如果都没有 000,那么就选更小的插入,因为这样才能保证成功的几率最大。如果最小的数都超过了现有的行数,那么这就说明不可能通过任何方法构造出合法的序列,我们就输出 -1。最后,如果两个序列都空了并且没有输出 -1,我们就输出答案序列。我们可以设两个数 iii 和 jjj,分别代表第一个序列和第二个序列分别已经删到
2021-08-03 20:49:55 88
原创 CF1553B题解
题意:给你两个字符串。现在有一个小片,你可以将它放在第一个字符串的任意一个位置上,往右移动若干格(可以为 000 格),再往左移动若干格(可以为 000 格),问小片从第一次开始覆盖到的字符组成的字符串可不可以为第二个字符串。比如字符串为 IAKIOI,如果将小片放到第二个字符上,即 A,然后向右移动 222 格,再向左移动 111 格,最后的字符串即为 AKIK。这道题我们可以暴力。我们知道,小片的移动过程为先右再左,不可能左右交叉或者先左再右。于是,我们枚举的就是从向右移动到向左移动的分界
2021-08-03 20:47:32 164
ABC312 Code (A-E)
2023-08-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人