自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(708)
  • 收藏
  • 关注

原创 Goodbye2023, Hello 2024!

2023的所有比赛结束了,以后 xcpc 相关的比赛应该都和我没啥关系了,可能只打打蓝桥天梯了,等到明年的时候估计很多算法的东西也都忘记了吧,彻底退休了。打铁人不配叫退役,也不敢公开这篇文章,只敢在没人看的CSDN上随便写写。没有其他acmer的光鲜亮丽,没有各种奖项,只有打铁。说实话,打铁之后并没有我之前想象的那样玉玉,反而很平静,甚至天天打游戏到两点来弥补内心的空虚。打了一个月的游戏,接下来该学期末了,课内还一点不会。不知道该写什么,那就写一下这一年都干了些什么吧。

2023-12-31 23:03:18 1474 1

原创 2023年浙大城市学院新生程序设计竞赛(同步赛)G

不难想象其实就是操作结点的子树和该点连通的黑色连通块的所有结点,对这些结点会有影响。首先想法非常单一,一定是去枚举操作点,然后看它染白和不染的价值差值。黑色连通块容易用树形dp求,然后就是操作点到最近白色祖先距离怎么求。那么差值其实就是黑色连通块大小 * 操作点到最近的白色祖先的距离。也就是说,把一个黑色结点染白之后,对哪些结点的价值会影响。dfs即可,记录上次的白色结点是什么即可。

2023-12-23 23:45:17 969 1

原创 【计数DP】牛客小白月赛19

然后看影响决策的因素:两边的火焰情况,那就 dp[i][0/1][0/1]表示 前 i 个,该位有无火焰,该位右边有无火焰的方案数。然后状态设计,先设 dp[i]首先做法一定是计数 dp。这样设状态也可以算贡献。然后一定就是分类讨论了。

2023-12-23 23:24:08 830

原创 11111

【代码】11111。

2023-12-23 16:49:56 612

原创 【贪心】牛客练习赛90 C

然后看,他让我们选一段子序列,注意到子序列内部无序,那其实就是子集,那就可以考虑排序贪心了。注意到贡献是长为 k 的段的贡献加起来的,一段的贡献是 max(0, sum - s)我们要求每个 k 的答案,k 已经是 1e6了,剩下的要不就O(1)要不O(logn)logn的话,考虑调和级数枚举(其实这个做法可以根据复杂度猜出来),那就是去枚举每段了。考虑从大到小排序就好了,其实就是从大到小选。肯定出发点是去考虑伤害的贡献。那就直接枚举每段算贡献即可。

2023-12-20 02:09:21 620

原创 【setDS】牛客练习赛90 D

考虑复杂度,如果一个位置的集合的大小 >= 46了会被删除,因此一个位置的复杂度贡献就是 O(46 * logn),一个位置只能被修改一次,修改的总复杂度就是O(46 * n * logn)我们操作的集合一定是size <= 46的,考虑去维护元素个数 <= 46的集合位置,对于这些位置暴力修改即可。首先有个结论,若元素个数 >= 46,则这堆元素中一定能找出这样的三元组,证明就是斐波那契的极限情况。因此,若询问区间长度 >= 46,则一定能找到,如果不是的话考虑暴力即可。

2023-12-20 01:53:13 644

原创 【离线】牛客小白月赛39 G

这里有个容易想错的点,对于 Bit 维护的 y 轴,query(x)维护的是 y 轴上 <= x 的值,也就是说,query是个 y 轴上的前缀和。然后去遍历值域,如果值域很大的话需要排序+离散化,但是这里不需要。这样就直接写就好了,注意询问需要用 vector 存,否则会出错。确定好两维:x 轴是1 ~ n, y 轴是 k 的大小。query(x)是个前缀和,它不是 y轴 上某个数的值。这种离线Bit,一般都是去考虑二维数点就能写清楚了。

2023-12-16 01:45:37 619

原创 【setDS】牛客小白月赛83 E

我们的答案是一个位置 pos 后面还有多少位置和这个位置的颜色相同,考虑得到这个答案我们需要维护什么东西。首先,一个必要步骤是把它转化为两个序列,这样就变成了一个序列DS问题。用 set 维护位置,剩下就是常规的增删改查了。我们只需要维护颜色之间的边界的位置即可。

2023-12-15 23:41:56 684

原创 【01分数规划】ABC324F

首先看到这个形式很容易想到 01 分数规划,即去二分答案,然后就是转化成 是否存在一个路径使得 sigma b - mid * sigma c >= 0。显然只需要改变一下边权,跑一遍最长路即可。

2023-12-14 01:30:10 582

原创 【字符串】ABC324E

然后因为拼起来之后要包含 t 这个字符串,隐隐约约会感觉到和前缀后缀子序列有关。满足ai + bj >= m有多少对 (i, j),这个直接值域统计一下即可。统计两个指针的方案数一定是枚举一个,统计另一个。退役啦,接下来的博客全是图一乐啦。

2023-12-14 00:45:15 679

原创 The 2021 CCPC Weihai Onsite ADGJM

一开始border有很多,每次操作之后,border只剩下操作位置左边的所有border,因此可以考虑把所有border求出来,用差分数组维护即可。注意到 sigma ai <= 1e5,ai 的不同种类数是 sqrt(1e5) 级别的。很明显的组合思路,直接对于每种糖果去分配给队伍即可,即在 k 个队伍里选 ai 个分配。首先周期 = 串长 - border,那问题转化为修改对 border集的影响。但是这样的复杂度是 nk 的,考虑优化。对于一排相同的 ai,需要再乘个幂次。

2023-12-06 10:44:15 574

原创 2022 China Collegiate Programming Contest (CCPC) Guangzhou Onsite

求组合数,考虑先分配再排列。

2023-12-06 10:25:43 712

原创 2022 China Collegiate Programming Contest (CCPC) Guilin Site

题意思路数所有周围没L的格子。

2023-12-05 00:00:09 615

原创 2022CCPC绵阳 ACGHM

首先注意到贡献可以按深度统计,对于每个深度dep,贡献是在dep深度中属于的子树种类数,如果在该深度中子树存在点,那么该子树的贡献就要 + 1。设dp(x, i, j)为,已经进行了x轮,A选了i个数,B选了j个数,的最大得分差(这里指A - B)注意到每一轮都是较小的那个数被删除,因此每次会删至少一半的数,因此轮数一定很少,暴力模拟即可。如果是A操作,决策就是选一个a或者禁用一个b,如果是B操作,决策就是选一个b或者禁用一个a。状态数为 1e5 * 10 * 10,很够,因此一定就是这个做法。

2023-11-16 15:06:04 313

原创 2023CCPC深圳流水账

在高铁上无聊,写一个这三天的小总结吧不知道该写点啥,就想到什么写什么了铁了,也在意料之中,概率期望和字符串一直是弱点,考前也在赌不会考这两个结果两个都考了,赫赫,看来在杭州站之前得好好写点区域赛真题 考前那个晚上睡不着,遂水群。然后看到jgh发了一个离线BIT的题,发现上次写这样的题好像是很久之前了,于是在来的高铁上云刷了很多离线BIT的题,顺便复习了莫队和其他的一些数据结构,还有一些DP优化,总之看的东西一点没有考到。到酒店之后很早就睡了,第二天要早起去拿物资。 逛了逛szut的校园,学校的高楼和周边的民

2023-11-13 12:45:12 455 2

原创 【2021ICPC沈阳】EFBJHL

但是这样的正确性不能保证,这样只能保证对于这个数相连的所有数组成的这个集合而言是对的,放在树上其实就是只考虑了结点 u 放出去的边的所有 v构成的这样的集合,没有考虑整棵树。一开始想的做法是直接贪心,对于一个数的第 j 位,如果和这个数的异或为1的个数大于异或为0的个数,那么就把这个数的第 j 位置为 1,这样异或之后0就比1多了。那不就是割边吗,我们只需要在跑割边的过程中把连通块的边数统计一下,标记一下哪些边是合法的, 统计哪条边是合法边中边权最小的即可,然后减掉这个边就是答案了。

2023-10-30 17:37:16 361

原创 【组合计数】CF1866 H

设 f[x] 为恰好有一个最大值为 x 的方案数,我们要求这个,那就设 g[x] 为 至少有一个最大值为 x 的方案数,那么答案就是 f[x] = g[x] - g[x - 1]不知道这种trick叫什么,昨天VP刚遇到过。这里也一样,不过要稍微变一下。

2023-10-26 23:02:47 502

原创 【欧拉函数】CF1731E

对于 k 次操作,gcd(u, v) = k + 1,代价的贡献就是二元组 (u, v)的个数 * (k + 1)这个是个很经典的欧拉函数的套路,可以用线性筛把欧拉函数求出来,然后求个前缀和 s[i] 就是。1 ~ i 的所有数中 (u, v)满足 gcd(u, v) = 1的二元组个数。容易发现,操作从k大到小的代价一定是最小的。那么就要我们求二元组个数。

2023-10-26 17:12:28 286

原创 【计数DP】CF1794D

所以还剩下 n - (sum - j) 个位置,也就是说,在 n - (sum - j) 个位置中选 y 个位置,那就是 C(n - (sum - j), y)问题就是出在这里,我不知道怎么求组合数,一心想着对于指数求可重集排列,但是这么多的指数的个数是很难维护的。然后就是考虑转移,这种计数类的dp在转移的时候都是考虑多一格会多出多少贡献,贡献一般由组合数求出。前缀已经选了 j 个底数,设前缀的个数和为 sum,那么前缀有 sum - j 个数作为指数。设多出来那一格的数为 x, 它的个数为 y。

2023-10-25 01:08:24 426

原创 【强连通+背包】CF1763E

那么用哪些多大的强连通连接在一起就用背包处理一下就好了,因为要让节点数尽可能少,代价就是节点数,价值就是每个团的点对数,即x * (x - 1) / 2。然后,因为在这个前提上,要让单向节点数尽可能多,那就考虑将这些强连通分量用有向边连接。首先,先考虑第一个条件,要保证是p个节点互相到达且节点数最少,一定是个强连通,把背包的方案求出来之后直接计算贡献即可,具体看代码。然后背包完之后考虑第二问,求单向点数。

2023-10-24 22:41:38 225

原创 【反悔贪心】2022ICPC南京 G

这里的做法是反悔贪心,先默认每次遇到0的时候合并,然后在遇到-1发现不够的时候反悔,把之前的合并变成加1即可。首先容易发现,合并操作对平均攻击力有贡献,但是加一个1就没有贡献,因此首先考虑每次遇到0的时候都合并。但是很快发现如果这样的话,遇到-1就不一定有足够的1给你合并,因此在遇到0的时候还得考虑后面够不够。但是现在反悔,先加1变成1 1 1,再合并变成 1 2。在反悔的时候,考虑维护的东西在反悔之前和之后的差值。这样 攻击力之和就 + 1, 个数也 + 1。

2023-10-24 20:32:03 208

原创 【二维差分】ICPC南京 A

那么我们要维护有洞会让袋鼠消失多少,只有在u<=x<=d,l<=y<=r的才是有效被消失的袋鼠,那么就维护mp[i][j]表示从(i,j)点开始会让多少只袋鼠消失,发现对于点(x,y),只会对一个矩形内的数加1,左上角为(u-x,l-y),右下角为(d-x,r-y)的矩形,变成二维差分维护,那么在二维差分中给一个点加1等于给它往右往下的全部点加1.所以记录u,d,l,r,表示在移动时所产生的最小矩阵的上下左右边界,这样剩下的袋鼠数量就是有(d-u+1)*(r-l+1)个。

2023-10-22 02:16:49 287

原创 【暴力剪枝】CF1708D

0的操作没啥意义,所以我们要找到第一个 >0 的数对其后的序列进行排序,就能大大减少复杂度。这道题告诉我们实在没思路可以猜个暴力剪枝的做法。

2023-10-21 21:46:14 370

原创 【分类讨论】CF1747D

这个分割点假设是 k, 需要满足pre[l - 1] == pre[k] 且 位置的奇偶性要和 l 一致,因为区间长度要是奇数,那么就是去找后面第一个满足这个条件的就行。else 如果是偶数,需要看是否存在一个分割点使得一个区间可以分割成两个区间,两个区间的区间异或和都是0。这点有点难注意到,我们很容易地会以为如果一个区间的异或和是0,一定存在分割点,其实不一定,这点需要记住。如果长度是奇数,那么直接操作即可,答案一定是1。显然,如果区间异或和不是0一定无解。如果区间内全是0,答案一定是0。

2023-10-21 21:06:55 272

原创 【分类讨论】CF1834D

对于第一种情况,贡献的最大值就是mxlen - milen的2倍,这个没啥好说的。这是个分类讨论题,一开始还以为是枚举什么的,发现根本枚举不了。注意到最终的答案就两种情况:区间包含 or 区间不包含。如果两个区间有交,那么贡献就是不相交的两部分取大。如果两个区间无交,那么贡献就是两个len取大。实现的话就是把左端点和右端点单独拿出来就好。

2023-10-21 17:36:08 530

原创 【换根DP】CF1882 D

然后就可以直接换根了,首先考虑树形DP,设dp[u] 为 把 u 子树染成同一种颜色的最小代价。首先观察到,先对儿子一定比先对父亲操作来的代价小,因此考虑先对儿子操作,再对父亲操作。那么根据刚刚的先操作儿子,转移方程为。然后换根就正常换就好了。

2023-10-21 16:20:41 210

原创 【离线/并查集】CF1213 G

心血来潮写一下这个*1800的题解,思路一下就出了,但是一开始多了个log被卡了,提醒一下自己。问题是点对的贡献怎么算,很显然可以拆,对于一个连通块,贡献为sz * (sz - 1)这样子 T7了,但是枚举权值就没问题,不知道为什么这样会快,可能是STL的问题....离线的写法还是有讲究的,最好是把答案全部求出来再去O(1)查询,不然容易被卡。排序之后枚举边的权值,就是把边一条条加上去,相当于Kruskal的过程了。之前是 x * (x - 1) / 2,y * (y - 1) / 2。

2023-10-20 00:23:29 275

原创 【MST】 CF1108 F

对于这些边,如果加了该边和现在的边集产生环,那么这边一定不能加,改边不影响MST的唯一性,因此这种边不需要操作。设想样例中和5结点再连一条权值为3的边,那么该边一定要加上MST,否则就不连通了。归根到底,我们要操作的是和Kruskal最后一条边权值相同的边,且可加可不加的边。这启示我们,我们要操作的是和Kruskal的最后一条边权值相同的边。那么,对于加了该边之后和现有的边集不产生环的边,都要操作吗,也不是。权值为3的两条边,选其中一条即可,但是不能两条都选,这样会形成环。

2023-10-15 01:42:59 368

原创 【前后缀技巧】2022牛客多校3 A

预处理出前缀lca和后缀lca,枚举哪个消失即可,可以统计方案数。这种是典中典中典,对于gcd,背包问题都是一样的处理方式。

2023-10-05 00:58:31 481

原创 (枚举 + 树上倍增)Codeforces Round 900 (Div. 3) G

首先,目标值和结点权值是直接联系的,最值不可能直接贪心,一定是考虑去枚举一些东西,依靠这种枚举可以遍历所有的有效情况,关于怎么跳其实可以参考树上倍增往上跳的跳法,记录一个数组指向下一个结点,在dfs上维护即可,有点像在树链上DP。如果考虑在链上枚举,如果前缀或值不变,那么这样的枚举是无效的,我们直接考虑跳着枚举,只枚举所有。注意到一条路径上的前缀或值不会超过 logV个,因此考虑枚举前缀或值。如果去直接在链上枚举的话, 复杂度是O(nq),肯定不行。关于每次跳使前缀或值变化的最深的点,我是这样理解的。

2023-10-03 23:23:14 389

原创 【二分图染色】ARC 165 C

首先考虑一条链的情况,注意到如果两条相邻的边加起来 < x,一定不行。不合法的情况是相邻的点相同颜色但是边权 < x。同时注意到 x 具有单调性,考虑对 x 二分。在check时进行二分图染色。这个结论推广到图也是一样的。

2023-09-26 01:40:00 347

原创 【简单图论】CF898 div4 H

实现就很简单,先去树上找环,然后找出这个根,分别给a 和 b BFS一遍,得出两个dis数组,比较一下即可。v 离它所在的树枝的根的距离 < m 离这个根的距离时是 YES。对于只有的环情况 和 m = v 的情况需要特判。

2023-09-25 21:03:10 933

原创 【暴力DP】CF1409 F

首先有个很明显的结论是:替换的字符一定是那两个字符之一。为了计算贡献,需要把前缀 t1 的数量也放进状态里。那么替换成哪个字符贡献更大不确定,因此考虑DP。因为有操作次数限制,直接把操作放进状态里。然后就暴力分类讨论转移就好了。

2023-09-23 01:16:55 258

原创 【枚举+贪心】CF1409 E

然后就能直接做了,枚举一个区间,然后找这个区间后缀的最大贡献的区间即可,所以需要维护一个后缀贡献的最大值。首先贪心的结论很明显,选两个贡献最大的区间。还有一个结论,这两个区间没有交点。

2023-09-23 01:06:47 291

原创 【期望+状压DP】 2021 CCPC G

注意到在转移过程中需要用到用了哪辆车的两点之间的最短路,因此我们考虑预处理这个最短路,这个就类似于分层图的思想搞一搞就好了。设 dp[x][st] 为 当前处于 x 结点上,且经过的结点状态为 st 的最小期望路径长度。要求最小的期望长度,我们可以遍历所有可能的路径,统计这些路径的期望长度的最小值即可。可能关于期望的状压DP用记忆化搜索会好处理一点(?这里很经典的处理方式是状压DP。注意到 k 的范围是18,可以考虑状压。这里的状压DP我们用记忆化搜索解决。

2023-09-23 00:05:12 270

原创 (典题)线段计数 CF690 div3 F

既然存在一条线段和其他所有线段相交,不知道是哪条线段,考虑枚举这条线段,然后计数没有交点的线段个数,取min。对于这个计数是个典,考虑将所有线段的端点扔进vec里,二分计算贡献即可。这题没什么性质可言,可以说就是纯纯的套路题。

2023-09-15 00:43:20 271

原创 【数学】ABC 319 E

首先注意到每个询问的范围是1e9,不难想到答案一定存在某个循环节,最后一定是要 %T的。那么只需要枚举起点,最多lcm(p1, p2, p3....)个,然后模拟过程就好了。猜想循环节为lcm(p1, p2, p3, ....)p1 和 p2的 T = lcm(p1, p2)p2 和 p3的 T = lcm(p2, p3)那么问题就在于找到这个循环节是什么。

2023-09-10 21:20:45 303

原创 【DS思想+堆贪心】CF595div3 D2

考虑nlogn做法,先去枚举点,然后把覆盖该点的所有区间扔进优先队列里,优先删除右端点靠右的。大家都说这是典,但是我不懂怎么个典法,可能堆贪心都是这样做的吗,不懂。那怎么看是不是坏点,还得维护一个差分数组,边枚举边维护。首先肯定要贪心,对于一个坏点,优先删除覆盖别的点多的。感觉突破点就是堆贪心。

2023-09-08 23:48:55 286

原创 【简单几何】CF Edu11 D

和蓝桥杯国赛有道题类似,都是用中点来确定图形防止精度缺失。

2023-09-06 11:21:04 234

原创 【枚举子序列+组合数学+推式子】Cf Edu11 E

【代码】【组合数学+推式子】Cf Edu11 E。

2023-09-06 11:05:28 248

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除