2014 年省选++

*的是作者感觉不重要。

?是作者无法理解的(。

!是作者还没有写但是准备找时间写的。

另外:所有紫题及以上都加入了,蓝题及以下基本没有加,加入的题如果太水会标*

后面的数字是作者认为的重要程度,并不准确,判断依据跟思维难度关系较大。

2014 年省选++

写在开头:

本篇去掉了“无意义”的题。

NOI

购票 1

神仙题+神仙转化。

采用 dfs 退出序来使得中间非路径上节点均不对当前答案产生影响

更多的看第一篇题解,不过码风实在是。。。一言难尽。

WC

Chery: 我看你像 WC,看你像 WC,你像 WC,像 WC,WC,C……

时空穿梭 0

神仙计数。

前置:

g=fμf=g1

结论:每种方案总存在 vNpN 的直线表示方案。

然后找到每一维最大向量和最小向量的差 xi,那么令 d=gcdi=1mxi,这条线上最多可以选择 d+1 个点。

gc(n)=d|n(d1c2)μ(nd),那么就有 (n1c2)=d|ng(d)

因此方案数是:

xi((gcdi=1mxi)1c2)i=1m(mxi)=xi(i=1n(mixi))i,d|xig(d)=d1g(d)xi|i,ximi1d(i=1n(mixi×d))=d1g(d)i=1n(xi=1mi1d(mixi×d))

直接做 O(Tnm)

注意到后面一部分可以先对每一维分开做,每一维内部都可以整除分块从而得到一个关于 d 的一次函数,这是个共有 O(mi) 段的分段函数,因此可以维护右边是一个关于 dn 次函数。每次乘、除以一个一次多项式,总共变化 O(nm) 次,就能过了(虽然感觉直接做也能过)。

第一篇题解写得很好,不过我太菜了有个地方没看懂/kk。

紫荆花之恋 1

水水板子

题出的很好,下次不要出了。

IOI

friend 朋友 1

最大独立集

神仙 dp。(感觉以你谷的评分方式可以评紫)。

考虑将 ihost[i] 连边,那么转化成树上问题。

更改树上最大独立集 dp 数组的定义:dpi,0/1 表示与 i 子树内相连的点可不可以选的最大贡献。发现如果依然是树上问题,转移不变,且刚好可以用到这道题上。

game 游戏 2

构造。

题解的方法更巧妙,不过也有比较简单的最小生成树写法(欸嘿。

holiday 假期 3

决策单调性+主席树优化(区间前 K 大之和,主席树上二分)。

APIO

连珠线 1

构造+换根 dp。算是高质量换根了吧(。

顺带提一下,我当时做这道题的时候不理解为什么在确定根的情况下只可能是父亲-自己-儿子这种结构(应该没有人和我犯一样的错误吧),其实是题意转化错了,注意任意时刻操作完之后当前图的形态是连通的

序列分割 1

首先有暴力 dp,设 dpl,r,k 表示 [l,r] 用了 k 次分割的最大价值。

dpl,r,k=maxi[l,r1],j[0,k1]{dpl,i,j+dpi+1,r,k1j+suml,i×sumi+1,r}

然后发现(前面忘了,中间忘了,后面忘了,这个解法总之就是只能度过一个相对失败的人生)这个解法好像不太能优化,考虑观察性质(看题解)。

发现无论我们以怎样的顺序切割序列,只要结果相同,那么得分相同。如果设每一段的和分别为 a1,a2,,ak 那么得分为 i=1kj=i+1kaiaj。证明可以采用归纳法:

  • 当序列分成一段或者两段的时候,显然成立。

  • 假设当划分成 k=x(x1) 时成立,那么划分成 k=x+1 段时,假设每一段的和分别为 a1,a2,,ax+1,假设第一次断开处是 y(yx),那么贡献为:

    i=1yj=i+1yaiaj+i=y+1x+1j=i+1x+1aiaj+i=1yj=y+1x+1aiaj=i=1x+1j=i+1x+1aiaj

于是原命题得证。

于是就很简单了,我们直接设一个新的状态:dpt,i 表示前 i 个数字分成了 t 段的最大得分。

dpt,i=maxj=1i1{dpt1,j+(sumisumj)×sumj}=maxj=1i1{dpt1,jsumj2+sumisumj}

嗯,看着像什么呢~

斜率优化。考虑分层计算,处理第 t 层时,对于所有 j<i,建立 (sumj,dpt1,jsumj2) 的上凸壳。然后用斜率为 sumi 的直线去切这个凸包,切到的点就是最优决策点,证明显然。

总复杂度 O(nk)(凸包用单调栈维护,发现每次切的斜率是单减的,喜欢二分的同学可能需要卡常(笑),因为我最慢的点跑了 969ms(不开 O2 的 O(nk) 做法))。

AHOI/JSOI

支线剧情 3

题意转化:给出一个 DAG(其中 1 没有入度),每条边有边权,求出若干条路径,满足每条路径的起点1,并且所有路径经过的边集的并为全集。一条路径的长度为其上边权和求最小。

解法:每条边至少经过一次,并且每经过一次就会付出一次代价,所以转化为上下界最小费用可行流

另,有一道类似的题:清理雪道,是有源汇上下界最小流

奇怪的计算器 1

神仙题:不一定需要维护操作并对询问进行“查询”,可以用数据结构记录询问(emm,好像在哪里见过。

重要性质是任何时刻当前询问的结果的单调性和询问单调性相同

类似的题:Siano

骑士游戏 1

一种搜索套路,使用类似最短路的方式搜索和更新。

以前只在暴力部分分的地方见过,没想到还有专门的题。

这道题怎么不卡掉 spfa 啊(恼

dijkstra 的写法是类似于“拓扑排序”的。

拼图 2

看着有点套路,其实也很套路。

首先是根号分治,我们只需要重点分析较小的那一维

  • nWi:考虑枚举上下边界 l,r,找出所有最左边这一段的 [l,r] 为空,最右边这一段的 [l,r] 为空,中间为空的所有拼图,然后拼一拼。
  • n>Wi:考虑枚举每一个点,找到他上面的第一个非 0 点,然后以这个边界来重算。这个算法类似于悬线法oi-wiki 链接)。

另外,还要加上每个矩形内部的最大值。

总时间复杂度 O(nmnm)

调了好久(。

JSOI

电信网络 3

额,最大权闭合子图套了个平面图???

歌剧表演 3

乱搞,随机化+两个 mapset 加 hash 过了。挺有意思。

std::mt19937 rnd(19260817);
std::uniform_int_distribution<int> dist(1, 1e9);

std::map<ll, std::set<int>> A;
std::map<int, std::set<ll>> B;

19260817 我的神!!

强连通图 2

第一问是板子。

第二问的话,考虑到一个强连通分量内部是没有入度或者出度为 0 的点的,所以答案上界是 max{0,0}。考虑只要连了这么多边,就可以使得整张图变为强连通图,所以答案就是这个。

学生选课 3

二分 + 2-sat

支线剧情 2 2

真没想到这玩意还有后续。

仔细一看,为什么“加强了”之后数据范围反而扩大了,但是:

i=1nki=n1

嗯,原来改成树上问题了啊,可以。

dpi,0/1 表示当前在 u 号节点,u 中是否使用存档点的最小代价,u 子树内叶子个数为 lu

dpu,0=(u,v,w)E(dpv,0+lv×w)dpu,1=min(u,v,w)E{dpv,1+w+(u,v,w)Evv(dpv,0+lv×w)}

不过 dpu,1 的转移略有问题,因为我完全可以从根再下来一次多存一次档,所以要注意一下。

打兔子 2

奇特的 dp,还可以吧很考细节能力(至少对我这种彩狗是这样。

BJOI

想法 2

随机算法。

好像是有点版的。

CQOI

数三角形 原题2 加强1

这道题如果是这个数据范围,那他(前面忘了,中间忘了,后面忘了)总之就是只能度过一个相对失败的人生。

如果你选择 O(n) 的算法,那么这道题挺好的,计数练手题吧。

不过 O(n2)O(n2logn) 的算法是基础:

考虑随便选择三个点的方案数是 ((n+1)(m+1)3),在同一行上的方案数是 (n+1)(m+13),同一列方案数是 (m+1)(n+13)。接下来考虑在同一条斜线上。

可以枚举共线三点中可以通过枚举最外面两个点,直接确定第三个点的位置,假设两个点分别是 (x1,y1),(x2,y2)(为了不重复要求 y1<y2),那么第三个点的方案数是 |gcd(x2x1,y2y1)|1,这样时间复杂度爆炸。不过可以发现,有很多点的 |x2x1|,|y2y1| 相同,记为 a,b,那么方案数是 2(n+1a)(m+1b)(gcd(a,b)1),这样就可以优化到 O(n2logn),至于 O(n2),你可以考虑递推最大公约数,但是没必要就不展开了(。

考虑优化到 O(n),注意到我们设:

E=2a=1nb=1m(n+1a)(m+1b)(gcd(a,b)1)

那么有:

E=2a=1nb=1m(n+1a)(m+1b)(d|i,d|jφ(d)1)=2d2φ(d)a=1ndb=1md(n+1a×d)(m+1b×d)=2d2φ(d)S(n+1d,d,n+1d)S(m+1d,d,m+1d)

其中 S(a,d,n) 代表对一个首项为 a,公差为 d,项数为 n 的等差数列求和。

于是本题在 O(n) 的时间复杂度内解决。

通配符匹配 3

通过 动态规划+字符串 hash 求解。因为通配符个数很少,所以考虑按照通配符的位置分成若干段,然后发现每一段是可以 O(1) 转移的。

另外不推荐题解区第一篇题解,废话贼多/tuu。推荐这篇,还有好看的粒子特效(大雾。

危桥 2

神仙网络流。

对于我这种彩狗来说,想到网络流还是太跳跃了(。

第一个推荐题解是这篇

推荐题解(但是这篇的代码给错了(悲。

好耶,我问了别的大佬(感谢陈老师给的建议),他告诉我了一个高明的证明方式(关于为什么不需要建立虚点限制流量):

屏幕截图 2023-01-15 080856.png

FJOI

树的重心 3

简单 dp

首先找到重心。

然后以重心为根,做一次 dpfu,i 表示 u 子树内选择 i 个点(选 u)的方案数。

分类讨论:

  • 两个重心:

    这个稍微简单点:假设重心是 rt1,rt2,那么答案是:

    i1frt1,i×frt2,i

  • 一个重心:

    考虑再进行一个的 dpgi,j 表示以重心为根,选了 i 个点(不包括根),最大子树大小为 j 的方案数。

    g0,0=1gi,j×fv,kgi+k,max(j,k)

最短路径树问题 2

强行二合一啊……

首先考虑第一个问题:如何建出这棵树?

因为我们在直接路径更新时是不能考虑最小字典序的,所以我们考虑先把“最短路径图”生成出来(注意这张图是有向无环图,并且不用显示的建立出这张图)。

然后考虑依次加入每一个点到生成树中:对于当前节点,找到他在“最短路径图”上所有出边中最小的一个点,若该点未被加入,更新该点为其儿子并转移到这个点上继续更新

为什么必须要这么做呢?因为如果有两条路径,比如 12414,两个都是最短路径的话,显然第一个是更小的字典序。

然后考虑第二个问题:如何找出经过 K 个点的最长路及个数?

因为 n30000,所以直接跑暴力就行了

好了好了,其实是点分治,然后随便存存就是了。

唉,数据是不是少打个 0 啊。

GDOI

Beyond 1

好题。

答案形如 Ai+1 开始往后匹配 Bj 个字符且 Bj+1 开始能够匹配 A 的前 i 个字符最大的 i+j

首先求出两个 z 函数。

考虑 z1(i),z2(i) 分别代表 A 的第 i 个元素能匹配到 B1 开始的第几个元素,B 的第 i 个元素能匹配到 A1 开始的第几个元素。

考虑一对下标 i,j,他们合法当且仅当 z1(i+1)jz2(j+1)i。考虑动态维护这个东西,在 i 逐渐减小时,合法的 j 只会逐渐增加,因此动态加入并查询前缀最大值就可以做到。

时间复杂度 O(nlogn)

1

求区间内选一个数和区间外选一个数最大的 gcd

考虑离线,然后加入一个数字就把他的所有因数加入。

*采集资源

水水 dp

传送 4

虽然有点水,但是还是有那么一点点细节注意吧(。

拯救莫莉斯 3

由题意,m7

所以可以轮廓线 dp

其实数据范围很小,还可以更暴力一点:状态压缩,dpi,x,y 表示前 i 行填完后,第 i 行和第 i1 行的状态分别为 x,y 的最小代价。

转移再来个 2m,总复杂度 O(n23m),随便跑(确信)。

其实很多状态用不到,转移常数会小很多。

HNOI

道路堵塞 1

推荐题解是这篇。其它题解没有细看,但是我觉得很不靠谱的一点是:你怎么敢用 spfa 的呀。

本题有很多类似的题,不知道怎么评成黑色的,比如这两道:玛丽卡

这道题与玛丽卡是最相似的吧。

画框 2

二维最小乘积生成树的网络流版。

二维最小乘积是块砖,哪里需要哪里搬。

江南乐 0

SG 函数基础(这些就背吧)+数论分块。

世界树 2

fake树练手题。

抄卡组 1

模拟,匹配,hash。

米特运输 2

可恶的阅读理解题!!!

至今没用看懂题面,建议直接进题解看题意。

ZJOI

推荐:没写数据范围的直接看题解代码是多少,不过据我观察好像都是 105

消棋子 1

两次都是模拟。(或许 std::map 会比 std::set 实现起来简单?)

注意本题并不需要输出方案,只需要输出数据中给的操作可以消除多少棋子以及最多能够消除多少棋子。(注意输出的数字是对数,即消除的不同颜色数)。

如果想要交完整板,可以去 loj 上面交:这里

2

至今记得这题,这可是我 FFT 入门题/ll。当时还说这个不应该叫力,应该叫场强(。

星系调查 0

神题。

需要很多解析几何基础。

推荐博客

以及非常厉害的东西

璀灿光华 1

难道不是璀璨吗23333。

首先建图:考虑三遍 bfs,首先任意找出一个只有三度的点作为 (1,1,1) 的点,然后计算其他点的距离,找到其某一个面对角线上的点(满足 dep2(n1)),然后令他为 (n,n,1),然后从他开始 bfs,找到一个符合点 (n,1,1) 的点,然后从他开始 bfs,然后就可以确定其它点的位置。

最后暴力搜索 n 个点的取向,时间复杂度 O(n6×n×a)

警告:本题略卡常,注意写法。

SDOI

太神了,领先了一个时代好吗!

LIS 1

首先有一道有点类似的题

然后考虑先求出最小代价,这个直接上最小割就好。

然后要求一组最小割的方案。

有结论:当前某一条边 (u,v) 可以存在于最小割的边集中,当且仅当 (u,v) 满流且 u,v 之间没有流量了。

证明:如果有流量,那么即使割掉 (u,v),依然可以补充至少 1 的流量,导致最小割变大。

另外其实不用每次割掉一条边重新求最小割,可以从 T 向 vcap(u,v),从 uscap(u,v)

*旅行

水水树链剖分+动态开点线段树。

重建 1

矩阵树定理好题。

数表 1

莫比乌斯反演好题。

说实话已经忘记当时怎么做的了2333。

重新推一遍发现自己忘记了直接用 σ1(d) 而是憨憨的用了 d

向量集 2

挺好的题。

维护上凸壳。

不过我想的还差了一步:

(x,y)(x,y)=y(xy×x+y)

就是标准的形式了。

至于动态凸包,可以用二进制分组。

!里面还是外面 0

放到 u 群里面问了下,得到了如下做法:

  • 首先,考虑暴力如何判定个点是否在多边形内:我们随机一条射线,并判断多边形的所有边与他的交点个数——奇数个在内部、偶数个在外部(可能会出错,但是以内是随机,错误率很小)。
  • 然后考虑如何处理多次查询,随机引一条射线改成:随机旋转整个平面,并使用 直线 x=xp,其中 p 是查询点。然后对于原多边形做扫描线。
  • 考虑加入强制在线:直接对扫描线过程中的平衡树进行可持久化,单次查询找到应该查的平衡树,并在这棵平衡树上查交点个数。
  • 考虑加入动态修改:删除一条边,可以直接看做加入这条边一次,因为交点个数我们只考虑奇偶性,从而只考虑加入边怎么办:
    • 对于边按照任意顺序二进制分组。
    • 组内重新扫描线+可持久化线段树
  • 单次查询复杂度 O(nlog2n),总修改复杂度是均摊的,为 O(nlog2n)

HAOI

走出金字塔 2

结论题,细节还是考察的比较多。(可能只有我这种彩狗会这么觉得。

我贺的 std/kk。

HEOI

大工程 3

虚树练习题。

逻辑翻译 2

遇到阅读理解题,我们就:

骂出题人**

完事

简要题意:给出一个多项式,这个多项式形如:

i=02n1aij=0n1xjci,j

其中 ci,j=[iand2j0]

给出 xj{1,1} 的每种组合的方程结果,求出原方程中所有 ai,并按照某种方式输出。

做法:考虑每次消去 xi,然后原式长度变为原来的一半,递归做就可以了。

时间复杂度 O(n×2n)

代码并不难写。

林中路径 2

简要题意:Q 次询问,求出从 st 经过不超过 K 条边的所有路径的路径长度的平方和。

Ai,Bi,Ci 是三个矩阵,他们的第 (s,t) 项分别代表从 st,经过不超过 i 条边的所有路径的路径长度的 0,1,2 次方和。

那么考虑求出 Ak,Bk,Ck

  • k=2x 时:

    Ak=Ax+Ax×Gx(这里左乘右乘没区别)。

    Bk=Bx+(Bx+x×Ax)×Gx

    Ck=Cx+(Cx+2x×Bx+x2×Ax)×Gx

  • k=2x+1 时:

    与上面类似,可以这么理解:

    如果把上面的操作看作是 merge(x,x),那么下面可以写成 merge(merge(x,x),1)

其实都到这个询问量级了,为什么不让我直接把所有答案都输出?

平衡 3

题意转化:求出 i=1kci=(n+1)k 的解的个数,其中 ci[1,2×n+1]ci 互不相同,答案对 p 取模。

之前题意转化错了(/ll)一直没有做出来。

然后这个东西,你发现 k 很小,暴力 dp 就好了,算是一种套路。

具体可以看题解。

人人说尽江南好 2

很好的博弈题,蓝色是恶评。

这道题一个重点在于,任何一方都可以将战局拉到最长。题解区证明写得有点少,总结一下就是:在一般情况下(3mn),任何一方都可以保证不同时出现两堆数量在 [m2+1,m1] 的石头,其实是因为有一个更强的结论:在非退化情况下,任意时刻都可以保证场面上最多只有两堆大于 1 个的石头堆,且如果有两堆,其中一堆数量为 2

证明可以考虑归纳法。上面提到的退化情况是指在最后剩余两堆数量为 1 的石子堆的情况,容易证明此时合并次数依然达到了最大值

计算合并次数可以手推式子。

SHOI

坏了,在家太摆了,赶紧贺两道题。

超能粒子炮 1

神仙计数。

题目中有一个特殊性质:

min{a,a1}1000

如果 a1000,那么其实原序列可以分成 O(nam)O(a) 段,因为每一段都有 O(ma) 个元素。每段都是一个公差为 a 的等差数列,因此两段之间的贡献可以直接算出。

代码实现较为复杂。这就是你贺 std 的理由吗

概率充电器 2

考虑到每个点都可以从父亲,本身,儿子处来电,而一般树形 dp 都无法同时考虑着三种情况,所以只有根的答案是对的。因此用皇恩换根 dp 解决(输入法成分复杂与我无关啊吧啊吧)。

五年前的人叫他 up and down

锐评:果然没爹的孩子好养活。

信号增幅仪 3

额,这道题既然已经告诉我们怎么拉伸的圆了,我们可以把它拉伸回来(。

具体就是在题目中给出的方向上把每个点缩成原来的 1p。然后跑最小圆覆盖就好了。

TJOI

Alice and Bob 3

嗑到了谢谢。

贪心的使小的数放在后面,但是需要满足:每个 xi 必须满足 j<iaj=ai1,xj<xi,对于相同的 a 必然满足越靠后的越小,所以只需要满足他前面第一个就行了。

建立出 DAG,用优先队列跑拓扑排序就可以了。

电影 3

简单平衡树模拟?

其实可以不要平衡树暴力(。

posted @   lazytag  阅读(67)  评论(5编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示