Typesetting math: 100%

2022省选前做题记录

luogu

[IOI2014]Wall 砖墙

题解

可以转化为区间取 min 和区间取 max .

规定一下下传标记的顺序推一下式子就行了.

[NOIP2013 提高组] 华容道

题解

先想到了朴素的 O(q(nm)2) 的算法.

接着发现只需要记录可移动棋子周围的空格情况.

但空格从这个棋子的一侧一道另一侧需要保证不经过这个棋子.

发现这个可以 O((nm)2) 预处理.

询问的时候就按照那个方法跑最短路就行了.

最短路的状态数为 O(nm).

[NOIP2017 提高组] 宝藏

思考

类比最小斯坦纳树的状态设计.

dpi,S 表示以 i 为根, 集合为 S 的最小代价.

dpi,S=min{dpj,T+wi,j+T中的边权和}.

T 中的边权和不太好算, 于是令 fi,S 表示当前以 i 为根, 集合为 S 的边权和.

但这样是错误的.

因为 dpi,S 可能由一个不那么优的 dpj,T 加上很优的 fj,T 转移过来.

题解

转变思路, 不从根的位置开始接, 从叶子开始接. ( )

dpS,d 表示集合为 S 最多经过的节点数为 d 的最小代价.

dpS,d=min{dpT,d1+S - T 中的最小边权和}.

至于正确性的证明, 由于节点是按深度一层一层的加的, 所以一定能包含最优解, 而加边的过程只可能偏大不可能偏小, 因此能得到最优解.

总结

我认为, 要得到最优解必须满足这两个条件:

  1. 状态必须包含最优解.
  2. 状态不能包含多余的部分或多余的部分一定劣于最优解.

[NOI2010] 超级钢琴

题解

考虑对于每个起始点 s 的一段子串如何得到最大值.

很明显用 st 表就可以做到 O(1) .

题目需要求前 k 大的和, 可以考虑在得到一个最大值后把区间拆开.

这个用堆维护就行了.

[JLOI2015]管道连接

题解

最小斯坦纳树 + "多余部分劣于最优解"定理.

对最小斯坦纳树转移式子的证明似乎也可以用这个定理 ? ? ?

总结

其实对于最优解问题, 只要转移方式合法, 且能够得到一种对最优解的划分, 那这个转移一定是正确的, 因为其它转移的情况一定更劣.

[ZJOI2007]最大半连通子图

题解

tarjan 缩点 + 记忆化搜索.

注意缩点后有重边.

[USACO07MAR]Gold Balanced Lineup G

题解

将一长串连等式拆成很多个等式, 再分离变量.

只需要维护每个前缀的信息就行了.

[POI2015]MYJ

题解

dpi,j,k表示[i,j]最小值为k的最大和.

转移

dpi,j,k=maxdpi,x1,k1+dpx+1,j,k2+w|k1,k2k,x[i,j]

https://www.luogu.com.cn/problem/P6617

https://www.luogu.com.cn/problem/P3792

https://www.luogu.com.cn/problem/P5278

总结

感觉这三道题用到的方法比较类似.

一般线段树是维护区间可合并的值.

如果问题需要支持修改,且询问的是值的相互关系,可以使用线段树 + set (平衡树).

P4198 楼房重建

总结

这道题启示我线段树的push_up不一定是O(1),也可能是其它复杂度,比如O(log).

只要区间的值能够通过子区间的值合并,都可以考虑使用线段树.

当然前提是合并的复杂度不能过高.

[HEOI2013]Segment

题解

李超线段树的模板题.

由于是求最值,因此维护的值可以不严格.

有这样一个定理,相交的两条线段一定可以从交点处分成两部分,一部分一条线段严格优于另一条.

因此可以只往一个区间递归.

这也是保证更新复杂度为O(log2n)的原因.

[CEOI2017]Building Bridges

题解

sumi表示前iw的和.

dpi表示以i结尾的最小代价.

dpi=sumi1+hi2+dpjsumj+hj22hihjA(j)=2hjB(j)=dpjsumj+hj2C(i)=sumi1+hi2dpi=C(i)+A(j)hi+B(j)

相当于每次加入一条线段,每次查询线段的最值.

使用李超线段树维护即可.

表面上看,如果用李超线段树维护复杂度应该是O(nlog2maxw).

但实际上每次更新的区间都是整个值域,线段树划分的区间数为1.

所以实际复杂度应该是O(nlogmaxw).

P5069 [Ynoi2015] 纵使日薄西山

题解

ax11,ax1,ax+11并不会改变它们三者之间的关系,因此只需要维护一个选择的被减的数的集合.

只要能进行区间合并的题都可以用线段树,这道题可以合并,因此可以用线段树.

sx,0/1/2/3表示线段树上的节点x的区间的答案.

sx,0表示未去除端点l,r.

sx,1表示去除了端点l.

sx,2表示去除了端点r.

sx,3表示去除了端点l,r.

再记一下状态vlx,0/1/2/3,vrx,0/1/2/3分别表示在sx,0/1/2/3状态下是否选择了左端点或右端点.

转移的情况有点多,就不在这里写了.

总结

我太菜了!!!

自己以前总结过的东西还是忘了.

如果能够合并就可以用线段树维护,做题的时候一定要多想想维护的区间能否合并!

这道题如果用set维护的话代码非常复杂,而用线段树维护却很好写.但是题解里基本上都是用set维护的.

很明显,set维护没有通用性,用线段树要好一点.

所以不能盲目的只看几个题解,要善于从茫茫题解中发现最好的那一个.

P1251 餐巾计划问题

https://www.luogu.com.cn/problem/P1251

设每条需求量为x,新餐巾费用为c,洗餐巾的费用和时间分别为c1,c2,t1,t2.

最开始的错误想法是这样的:

  1. S到早上连一条流量为无穷大,费用为c的边.
  2. 晚上到T连一条流量为无穷大,费用为0的边.
  3. 早上到晚上连一条流量为x,费用为0的边.
  4. 晚上到早上连洗餐巾的边.
  5. 早上到下一天早上连一条流量为无穷大,费用为0的边.

这样的问题在于同一流量花在了两个费用上,结果不是最大流,因此跑最小费用最大流是错误的.

所以,每一流量必须对应唯一确定事件.

发现每天产生的旧餐巾数是固定的,可以考虑它们的去向,它们一部分可以清洗,一部分直接丢弃,用流量限制即可.

而新餐巾可以无限制的买,流量为无穷大.

如何限制每天需要的餐巾数呢?

将每一种提供餐巾的方案用一总的流量限制即可.

P2766 最长不下降子序列问题

https://www.luogu.com.cn/problem/P2766

这道题以前水过了,今天重做,发现还是有颇多问题.

刚开始,我是只把一个点内部的边连成有限值,其余都连成inf.

但这有问题,仔细分析一下会发现当maxlen=12时需要特殊处理.

于是将数之间的边改成1,再判断一下maxlen=1的情况就行了.

P2770 航空路线问题

https://www.luogu.com.cn/problem/P2770

使用了一个重要的技巧.

将无向图中一条1n1的路径转化为有向图中两条1n的路径.

输出方案上有颇多细节,例如在残量网络上跑dfs时一条路径的流量不一定减少1,也可能减少2.

[NOI2004] 郁闷的出纳员

https://www.luogu.com.cn/problem/P1486

平衡树裸题.

从中加深了对splay写法的理解.

比如lowerbound可以这样写

int find(int val) {
	int x = root, res = -1;
	int mn = inf;
	while(x) {
		push_down(x);
		if(b[x].val < val) x = rc;
		else if(b[x].val >= val) {
			if(b[x].val <= mn) mn = b[x].val, res = x;
			x = lc;
		}
	}
	return res;
}

P3356 火星探险问题

https://www.luogu.com.cn/problem/P3356

输出方案的时候要注意.

不能边跑费用流边输出,因为可能会反悔.

对残量网络建新图时要注意反向边.

[NOI2008] 志愿者招募

https://www.luogu.com.cn/problem/P3980

线性规划转费用流.

设第i类志愿者的数量为xi.

ti,j表示第i天是否可以有第j类志愿者工作.

题目要求

{ixit1,ia1ixit2,ia2...ixitn,ian

变量为xi0.

需转化为网络流,因此引入新变量yi0,得

{ixit1,ia1y1=0ixit2,ia2y2=0...ixitn,ian+yn=0

因为siti连续,所以上减下差分后可以发现

初始xi的系数 差分后xi的系数
si 1 1
(si,ti) 1 0
ti 1 0
ti+1 0 1

siti+1连一条容量为inf的边.

剩余部分

{a1+y1=0a2+y2a1y1=0a3+y3a2y2=0...an+ynan1yn1=0anyn=0

i+1i连一条容量为inf边.

对于常数项,如果为正,则从S连边,如果为负,则向T连边.

要满足题目要求的不等式等价于S连出去的所有边和连进T的所有边满流,并最小化ixici的代价.

因此可以用最小费用最大流解决.

[NOI2012] 美食节

https://www.luogu.com.cn/problem/P2050

考虑把厨师拆开,分别表示最后做某种菜,倒数第二做某种菜......

费用分别为kti,j.

若直接建图数量太大,会超时.

由于EK每次只找一条路径,因此可以考虑动态加边.

P3357 最长k可重线段集问题

https://www.luogu.com.cn/problem/P3357

与https://www.luogu.com.cn/problem/P3980类似.

(0,1)开始将开区间标号.

(xi,yi)表示的是区间[xi,yi1].

ai,j表示下标i是否有区间j.

同之前那道题推导即可.

但是,这种做法太过复杂,熟练之后有更好的理解方式.

这道题的一般想法是并联表示选不选区间,但区间之间有关系.

那就干脆直接串联,一个单位的流量表示一段长度能被哪些区间覆盖.

[SHOI2014]三叉神经树(动态树)

利用三叉树情况少的性质(本质上只有两种),想到了O(nlog2n)的树链剖分.

令我震惊的是LCTaccess复杂度竟然是O(logn).

因此,把树链剖分改成LCT就可把复杂度降为O(nlogn)

总结

这道题调了一段时间的原因是push\_up的时候只上传了右子树.这样做是不对的,因为splay端点后并不是一条链.

[HNOI2012]永无乡

https://www.luogu.com.cn/problem/P3224

用时

1小时20分.

总结

splay写得越来越熟练了!

调题的主要时间花在了并查集sz没赋初值,以及合并时将sz与平衡树混淆上.

P3950 部落冲突

https://www.luogu.com.cn/problem/P3950

一遍过了!

用时

25分钟.

[AHOI2005] 航线规划

https://www.luogu.com.cn/problem/P2542

用时

1小时30分钟.

总结

这是一道LCT维护边双连通分量的题.

由于每次只会更改连向某条实链的fa指针,因此access的时候修改就行了.

写这道题的时候不是很清楚为什么可以这道修改,导致不仔细,有很多细节错误.

[WC2006]水管局长

https://www.luogu.com.cn/problem/P4172

用时

1小时

总结

三者取最大值是要用大于等于,因为两个最大值相等的情况可能返回较小值.

[WC2006]水管局长

https://www.luogu.com.cn/problem/P4172

用时

40分钟

总结

同https://www.luogu.com.cn/problem/P4172.

都是用LCT维护最小生成树.

P2617 Dynamic Rankings

题解

题解说是"树状数组套主席树".

我认为"树状数组套动态开点权值线段树"更合适一些.

树套树可以理解为使用多棵树维护一段序列,再将这些树用一棵树来维护.

[ZJOI2013]K大数查询

题解

同"P2617 Dynamic Rankings".

只是因为有区间修改,因此只能使用线段树套动态开点权值线段树.

等等,这好像有问题,因为外层线段树需要维护区间修改,要打lazytag,但这似乎打不了lazytag.

因此,考虑把位置线段树套权值线段树改为权值线段树套位置线段树.

权值上只需要维护单点修改,这是可以不打lazytag的.

[POI2011]ROT-Tree Rotations

题解

对每个叶子节点开一棵权值线段树,每次合并时计算贡献.

若不交换,贡献为t[t[x].rc].sizt[t[y].lc].siz.

若交换,贡献为t[t[y].rc].sizt[t[x].lc].siz.

[湖南集训]更为厉害

题解

如果ba的上方,那么对答案的贡献为min(k,depth[a]1)(siz[a]1).

如果ba的下方,有贡献的点为depth[depth[a]+1,depth[a]+k],且为a的子孙节点,每个这样的点对答案的贡献为siz1.

这是一个二维的结构,可以使用线段树套线段树,仔细想想可以发现没有修改,因此只需使用主席树.

[HEOI2016/TJOI2016]排序

题解

区间更新为排序的问题使我想到了CF的几道字母排序的题,只需要对每种值记录在某个位置是否出现就行了.

但这道题的值太多了,并不能直接这么做.

可是考虑到只有最后一次询问,所以可以离线.

二分最后的答案,把mid的变为1,<mid的变为0,最后检验那个位置的数是不是1就行了.

[CTSC2018]混合果汁

题解

二分一个最小美味度,把这些果汁放到权值线段树上二分.

先按每美味度从大到小排序,这样每次放入的果汁是一个前缀.

因此可以建出主席树.

P6071 [MdOI R1] Treequery

题解

分三种情况讨论:

  1. [l,r]全在p的子树内,答案为所有点的LCAp的距离.
  2. [l,r]有一部分在p的子树内,有一部分不在,答案为0.
  3. [l,r]全不在p的子树内,答案为距离p最近的一个祖先的子树中有在[l,r]的点到p的距离.但注意需要判断特殊情况.

区间LCA可以考虑求最小dfn对应的点和最大dfn对应的点的LCA,这可以使用线段树维护.但因为选的点有限制,因此要用主席树.

这样做的复杂度为O(nlog2n),但我似乎有一种O(nlogn)的算法.

考虑倍增的过程本质上是要找到一个深度最大的点,它既是p的祖先也是[l,r]中某个点的祖先.根据dfn的性质,似乎可以在pdfn左边和右边都找一个最近的dfn,求它们的LCA,取深度大的那一个,再特判一下特殊情况就行了.

[国家集训队] middle

题解

考虑二分中位数mid,使用经典套路,把mid的设为1,mid的设为1,这个数是某段区间的中位数必须满足这段数的区间和0.又由于题目要求强制在线,因此需要建n棵线段树.但又发现每次只改变一个数的值,因此可以放到主席树上.

P4891 序列

题解

相当于是要支持对B单点修改,对C区间赋值.

对于区间赋值操作,如果CminBmax直接对C赋值且不修改答案;如果vBmin直接对C赋值且修改答案;如果不是这两种情况之一,需要暴力递归到子树内更新.

考虑分析这样做的复杂度.

Ci<Bi的数量为势能.

每次单点修改最多使势能增加1,而区间修改只会对Ci<Bi的情况暴力修改,所以总修改次数为O(n+q).

修改时需要使用快速幂,因此总复杂度为O(nlog2n)(nq同阶).

P6242 【模板】线段树 3

题解

对于区间取min操作,维护区间最大值,区间严格次大值,如果v最大值直接跳出;如果v>次大值调整最大值;如果v次大值暴力递归.因此,这需要维护两套标记,一套是最大值的加法标记,一套是非最大值的加法标记.

题目中加了历史最大值的查询,因此还需要维护加法标记的累计,总共4套标记.

codeforces

CF1623D

题解

di第i次能清扫与第i - 1次能清扫之间走过的距离

ans=i=1+p100(1p100)i1(j=1idj)(1p100)ans=i=1+p100(1p100)i(j=1idj)ans=p100d1+i=1+p100(1p100)i(j=1i+1dj)ans=d1+i=1+(1p100)idi+1=i=1+(1p100)i1di

令一个周期D=i=1T(1p100)i1di

ans=i=1+D(1p100)T(i1)=D(1(1p100)+)1(1p100)T=i=1T(1p100)i1di1(1p100)T

CF1622F

题解

  1. 先算几个n发现答案与n很接近.
  2. 于是想办法推一下i=1ni!.
  3. 发现剔除2,n2,n一定合法.
  4. 最后用异或hash解决.

总结

  1. 构造题要学会猜结论.如,这道题不知道要去除哪些,可以假设都选,再调整.

  2. 1n分解质因数可以O(nlogn)实现.

  3. 解决组合问题时可以用异或hash确定是哪一种组合情况.

CF1620D

总结

这是一道构造题.

如果结论比较好想,可以直接用结论解决.

如果结论难想,可以适当的用暴力枚举.

比如,这道题很明显可以考虑枚举12的硬币的数量.

CF1627E

题解

首先可以发现每一层只需要在相邻的点之间连一条边权为xi的双向边就行了.

又因为点数是O(k),所以可以用最短路解决.

但有一个问题,图中有负权边,不能用dijkstra,用spfa的话又会超时.

如果把一层看成一个整体的话是一张DAG,因此可以考虑dp.

CF1627F

题解

把格子的交点看成一张图.

跑一个关于点(n/2+1,n/2+1)中心对称的最短路就行了.

CF1634D

题解

先考虑n=4时怎么做.

发现可以用3次操作排除掉1个数.

接下来又是3个数,于是可以用同样的方法解决.

总结

构造题可以从小数据开始研究.

CF1634E

题解

有一个关键的性质:答案为YES当且仅当每种数字出现的次数都为偶数.

于是可以变成一张二分图,数组为一列点,每种数为一列点,数组向它有的数字连可重的双向边.

最后使用欧拉路径染色.

总结

新技能:

  1. 欧拉路径.

这题没想到是因为没有发现"每种数字出现的次数都为偶数"这个性质.

CF1634F

题解

类比给一个区间加数时使用的差分,可扩展为给一个区间加上一个数列.

加数

fi=fi1

于是构造

di=aiai1

同理,若

fi=fi1+fi2

可构造

di=aiai1ai2

于是可以解决这道题.

总结

新技能:

  1. 区间加数列且数列的递推关系为线性,可使用差分解决.

CF739C

题解

本题的关键在于需要想到差分.

这样问题就转化为求一段形如++的最大长度.

用线段树维护即可.

CF817F

题解

l,r,r+1离散化.

接下来,只需要维护一棵支持区间赋值和区间取反的线段树就行了.

注意,1也要加入数组中离散化,因为有可能lmin>1.

CF609F

题解

先将青蛙和蚊子的坐标离散化建出线段树.

线段树的叶子节点表示当前坐标能吃到它的青蛙的最小值.

青蛙舌头变长相当于区间取min.

对于那些吃不到的蚊子,把它们的坐标和编号放入一个multiset中,当青蛙舌头变长时取出来吃掉.

CF85D

题解

将序列a离散化建出线段树.

每个节点维护如下信息:

len:当前子树的数的个数.

sum[04]:模504的位置的和.

CF1070C

题解

如果本题需要支持区间查询,就变成了主席树裸题.

但本题连区间查询都不用,因此只使用权值线段树就行了.

CF1093E

题解

如果一个问题在全局能用某种树解决而区间却不能就可以考虑使用树套树.

pi表示biai中出现的位置.

如果没有特定区间的限制,只需要维护一个pi的权值线段树,每次区间查询[la,ra]中数的个数即可.

接下来思考,为什么不支持区间查询呢?

很明显,我们一棵线段树只能只能维护一段区间的信息,而我们需要有效的将查询区间进行划分,所以可以在外面套一棵位置线段树.

仔细想想还可以发现满足区间可减性,因此外面只需要套一个树状数组就行了.

总结

  1. 这启示我对于支持区间查询的问题可以先考虑区间固定的情况怎么做.

CF1633E

题解

最小生成树边的选择只与边的相对大小关系有关.

|wq|表示成绝对值函数的形式.

从最左边开始扫描,可以发现每经过一个交点,相对大小关系发生一次改变,因此交点之间的相对大小关系不变.

所以最多有O(m2)种最小生成树.

预处理出所有的最小生成树,若记录边,查询的复杂度为O(qn).

再仔细观察绝对值函数可以发现,若把顶点加入交点中,查询复杂度可做到O(qlogm).

CF1633F

题解

新加入一个点可以想成是把这个点到根路径上的边取反.

这可以使用树链剖分维护,注意,树链剖分不要打成"强链剖分"了!

CF1632D

题解

考虑刚开始的时候有很多区间都不合法,显然每个区间只需要修改一个数就能做到合法.因此,可以贪心地加数.

lst为上一个加数的位置,很明显以新加的一个数ai为结尾的区间的左端点不能达到lst.

再思考一下可以发现,gcd单减,区间长度单增,因此可以二分位置.

CF1632E1/E2

题解

很明显边一定是从1连出来的.

设新加的边的边权为w,答案为x.

深度为[1,x+1]的都可直接走到,因此要求的是深度为(x+1,n]的点的最大距离(不是直径).

设一个点的子树中的最大深度为mx1,次大深度为mx2,那么这个点对[1,mx2]的贡献就为mx1.

CF570D

题解

树上启发式合并维护每棵子树的字母种类.

总结

新知识点:

  1. 树上启发式合并.

CF246E

题解

还是树上启发式合并.

对删除操作的理解:dfs的时候优先遍历轻儿子,删完后才遍历重儿子并加入重儿子的贡献,因此消除影响的时候可以直接清零.

CF679E

题解

记录每个点离最近的42的幂次的距离.

如果没有操作2,修改的时候暴力修改是可以的,因为每个点最多修改log次.

考虑如果加入操作2怎么做.

加入操作2后,增加了一个区间赋值操作.

区间加的时候如果有区间赋值标记,可以直接修改,否则进入子区间修改.

CF920F

题解

d(x)这个函数减少的速度很快,当减少到一定数的时候就不会减少了.

因此可以暴力修改,时间复杂度为O(nlogn).

CF1070F

题解

首先,"1 1"的情况肯定可以随便选,选了一个"1 0"就必选一个"0 1",剩下的必然是"0 0"和"0 1"或"0 0"和"1 0".

考虑选一些"0 1""1 0"这样的数对是否对"0 0"是否有影响,假设选了n个"1 1",又选了k个"1 0""0 1"对.

此时为n+kn+2k,还能选n个"0 0".也就是说,选多少个"1 0"和"0 1"对后面的选择无影响,因此可以直接贪心选取.

CF1070G

题解

贪心策略如下:从集结点往两边扩展,能走到集结点的就直接加入,否则最后才加入.

CF1637B

题解

先假设一个长度为n的字段我们分成了n段.

它能产生的mex的贡献只能是1.

要想产生2的贡献,至少合并一次,但这又会使得段数减少1.

因此答案为n加区间0的个数.

CF1637D

题解

很明显需要把括号拆开,拆开后可以发现只需要计算i=1nxii=1i1xj就行了.

又发现xi的值域为很小,因此可以直接dp.

CF1638D

题解

考虑倒着做.如果有合法的方案,那么最后一步一定是选择一个四块相同的位置.选择一块位置之后,把这些位置的颜色染成0,表示可以任意选颜色,这是一个BFS的过程.

CF1638E

题解

好题,应该是一道势能分析的线段树题.

因为加是全局的,所以可以维护一个全局加的标记tagx,表示第x种颜色加了多少.

考虑区间改颜色的操作,先考虑这段区间的颜色都相等,维护一个sumx,若颜色从c1改成了c2,那么sumx=sumx+tagc1tagc2,查询答案的时候返回sumx+tagcolx即可.

于是在线段树上暴力更新即可,可以通过对相同颜色的连续段势能分析证明这样做的复杂度为O(qlogn).

CF1290E

题解

根据笛卡尔树的性质,一个节点i包含的是一个极大的区间[l,r],满足这个区间内的数的val<vali.

因此动态加数,维护每个数左边第一个比它大的位置li,右边第一个比它大的位置ri.

先考虑维护ri,li同理.

发现需要支持区间取min,区间加,单点改.

使用线段树维护即可.

CF1194G

题解

这道题需要使用数位dp.相当于是求满足Cx=Cy(Cx,Cyn)的数满足一定限制的个数.

限制那一维可以状压,并不是这道题的关键.

本题的问题在于如何设计状态使之满足Cx=Cy(Cx,Cyn)这个等式.

问题可以转化为在x,y固定的情况下有多少个C满足CxnCyn.

考虑从低位到高位做,每次枚举C在这一位填什么数,这会使得它进位,处理一下进位情况即可.

总结

数位dp不但可以从高位到低位枚举,也可以从低位到高位枚举.

只需记录状态exist表示从当前位开始到高位是否需要一位不填满即可.

这道题没有想出来的原因就在于只会从高位到低位的数位dp,但这道题如果从高位开始做并不好做,因为进位是从低位转移到高位.

新技能:

  1. 从低位开始枚举的数位dp.

CF1644F

首先,如果只有G操作,只需要求i=0min(n,k){ni}即可.

如果有F操作,只需要枚举复制的次数k,容斥一下就行了,容斥系数为μ.

atcoder

ARC 134C

题解

可以先将编号为2n的球一次放入k个盒子中(可空),使用插板法就是i=2n(ai+k1k1).

再将编号为1的球放入k个盒子中(非空),使用插板法是(a11k1).

ARC 134D

题解

设第一关键字为ai,第二关键字为bi.

刚开始一定选ai最小的数.

ai最小的数中存在ajbj,那么答案就是aj bj.

否则,所有的ai最小的数都满足ai<bi,按顺序输出即可.

再对ai>mina,ai<bans1的数按第一关键字排序,按顺序输出即可.

但是,还要注意一下ai=bans1的情况(就是因为这种情况没过),需要bi<banst才可输出.

其中,banst是第一个不等于bans1的数.

ARC 134E

题解

分类讨论题.

先手必败:数字均为01.

先手必胜:

  1. 最大的数为0.
  2. 至少有一个奇数.
  3. 没有奇数且存在除以4的余数为2.

接下来讨论所有数字均为4的倍数的情况:

  1. 若存在数字不被3整除,除了{4,8},先手必胜.因为如果余数相同,选择3取余就可转化为先手必败的局面;如果余数不同,选择12就可转化为{4,8}.
  2. 若数字均为12的倍数,可以220012枚举每种数字是否存在,暴力检验即可.

最后设dpi,S表示前i个数中,12的选择情况为S的方案数.

dpi,Sdpi+1,T

即考虑每个位置选择哪个12的倍数.

ARC 133B

题解

可以每个a向它能匹配的b连边,问题就转化为求最多的边使之不相交.

这是一个二维偏序问题,可以使用树状数组维护.

ARC 133C

题解

需要发现性质才能解决这道题.

若有解,则必须满足i=1nAii=1mBimod K.

先考虑所有格子都选K1,那么可以算出一个使每行,每列满足要求的需要减少的最小值.

最后减去行要减去的和与列要减去的和的最小值.

ARC 133D

题解

前缀异或和满足如下性质:

sum4i=4i

sum4i+1=1

sum4i+2=4i+3

sum4i+3=0

这样原问题可转化为在iL,jR中选择两个sum,使sumisumj=V,记这个答案为solve(L,R).

最后的答案可以用solve(R,R)+solve(L1,L1)2×solve(L1,R)容斥计算.

考虑如何求solve(L,R).

分类讨论即可,重点在于如何求4i+34i组合起来的贡献.

发现二进制下最后两位异或起来要么是1要么是3,而高位需满足异或起来和V相等,因此可以数位dp.

总结

新技能:

  1. 前缀异或和的性质.

ARC 070B

考虑什么样的数可以成为可有可无的数.

一个数a[i]是可有可无的数必须满足对任意的包含a[i]的选法,和要么小于k,要么大于等于k+a[i].

即当存在一种选法的和k<k+a[i]a[i]就不是可有可无的数.

也就是说,我们可以仿照倍增的方式从大到小枚举数,使它们尽量凑成小于k+a[i]的数.

对每个a[i]都这样判断就行了.

ARC 098D

考虑把减数换成加数.

c[i]=max(0,a[i]b[i]),想当于进入一个点至少需要c[i]元,可以获得b[i]元.

可以按c[i]从大到小建出一棵重构树.

一个点的子树表示这个点只走比它小的点能走到的所有点.

等价于,如果能走到这个点,就能走到它子树内的所有点.

于是,令f[i]表示走到i的最小初始钱数,对它进行dp即可.

ARC 097C

设状态dpi,j表示放前i个白球,前j个黑球的最小代价.

dpi,j=min{dpi1,j+costwi1,j,dpi,j1+costbi,j1}

其中,costwi,j表示已经放了i个白球,j个黑球,再放一个白球在这i+j个球的末尾的最小代价,costb同理.

考虑cost怎么转移,以costw为例.

costwi,j=costi,j1+posbj>poswi+1

其中,poswi,posbi分别表示第i个白球/黑球的位置.

这使我对动态规划的无后效性有了新的理解,动态规划必须从子问题转移过来.而什么是子问题呢?必须与后面的元素没有任何关系.例如这道题当我们考虑dpi,j时,需要把后面的所有元素"删掉",即假设只有前i个白球和前j个黑球,考虑costwi,j时同理.这能帮助我们更好的理解动态规划的转移本质.

ARC 095D

一道构造题.

先考虑已知pi时怎么做.

p从小到大排序,从小到大枚举权值i,每个i都向它左边的点的编号的最大值连边.

然后就发现树的形态是一个毛毛虫.

于是把树的直径求出来,查看非直径上的点的度数是不是都为1,如果存在大于1的,则判定无解.

考虑如何构造.

每个直径上的点的权值一定比它连向的非直径上的点的权值小,编号一定比它们大.

假设前面染了s个,当前点有d个它连向的非直径上的点,则它的权值按权值依次增大,编号依次减小的顺序赋值.

ARC138D

构造一个长度为2n的数列,包含数字02n1,使得相邻两个数字的异或和为k.

找到所有popcount等于k的数字构成的集合b,假设当前数字为a,那么下一个数字就为abi,其中abi没有在之前出现过.

考虑为什么这样做是对的,相邻两个数字的和一定是abia=bi,bipopcount等于k,所以一定是对的.

UVA

UVA11542 Square

https://www.luogu.com.cn/problem/UVA11542

题解

把异或转化为加和乘,用高斯消元解决.

总结

在一个只有01的系统中,即模2意义下,有

aba+b

aba×b

aba×b+a+b

posted @   yanchengzhi  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示