【做题纪要】10月“我想要太多太多装满房子,欢乐自由每刻每时” -- 《我想要太多太多》

[AGC006D] Median Pyramid Hard

看了一圈感觉就这题比较可做,那就先写这个,但是还是没啥头绪。

首先看咋写,这题的暴力肯定是直接从第 n 层开始反推就行的,但是复杂度好像很劣的样子,这肯定不行

考虑二分答案,我们二分塔顶的值,如果比这个点大我们就设为 1,如果比这个点小我们就设为 0

我们发现如果有两个相同的值挨在一起,那么它就会一直一直往上走

如果完全没任何相邻的那就一直是 0,这个明显比较神秘

复杂度 O(nlogn) 完全能过

代码写的挺神秘的

注意到我写完的代码有唐诗错误,for_(i,1,n) a[i]=read(); 处应该写 for_(i,1,2*n-1)

「JOI 2017 Final」焚风现象

这题似乎很优的样子,话说 JOI 是日本的 NOI 吗

考虑每次修改实际上对于区间内部和区间的非相邻格子没有影响,只对其相邻的两个格子有影响

因此我们可以先对于最开始的区间进行暴力计算,然后对于修改使用线段树维护

但是请看这条

没错,这题不需要线段树,直接暴力维护两点即可

那就解决了,我服了白打了个线段树

「JOI 2014」水筒

这题咋连个输入格式和输出格式都没有,急了,这我咋写啊,LOJ救我,不过咋又是JOI,JOI这么能出题吗

发现这是一个图论的题,看起来挺优秀的

考虑对于这样的一个图去打邻接矩阵,然后跑 MST,这是很明显的,对于每一条边的长度直接多源 bfs 去求即可,然后跑克鲁斯卡尔或者perm来重构这个图,去建立一棵树就行

最后跑一个树剖或者 lca 就行,由于机房里有 lca 所以考虑使用 lca 来求两点之间距离

然后就过了

P5044 [IOI2018] meetings 会议

我打 IOI2018 D2T3?真的假的?要上吗?

这题是 lca 上课讲的,我也就直接直接半途离线了,只能回来补了,悲

题意:给定长为 n 的序列 h,有 q 次询问,每次询问在 [l,r] 内找一个点 x,使得 [l,r] 内每个点到 x 之间最大值的和(即 i=lxmaxj=ixhj+i=x+1rmaxj=xihj)最小。n,q750000,h109

注意到这道题是区间问题,考虑区间 DP,用区间中的最大值将区间分为两部分时,分类讨论开会点在最大值的左边或右边

我们知道,开会点不可能在最大值这里,因为这个肯定是不满足最优秀的

fl,r 表示表示区间 [l,r] 中所有人参会的最小代价,其中最高点为 x

fl,r=min{fl,x1 +(rx+1)×hx  ,  fx+1,r+(xl+1)×hx}

转移方程如下,这个看起来就很优,但是状态是 O(n2) 的过不去

似乎优化不下去啊,这咋办。不慌,我们可以用笛卡尔树维护

现在我们将任意一个区间特化为了子树树根上的前后缀查询,考虑重设 DP 状态。

我们设 fx,i 表示 x 子树内从最左端到 i 号结点这段区间内所有人开会的最小总代价, gx,i 表示 x 子树内从 i 号结点到最右端这段区间内所有人开会的最小总代价。

如果 i[L,x1],是左区间的子问题。

fx,i=flsx,i

如果 i=x,多增加了一个点的代价,最高峰到左区间,代价恒为 hx

fx,i=flsx,x1+hx

如果 i[x+1,R],需要分讨:开会点在左侧或开会点在右侧。

  • 开会点在左侧,右侧所有点前往开会点必经最高峰,每个点贡献为 hx

fx,i=flsx,x1+(ix+1)×hx

  • 开会点在右侧,左侧所有点前往开会点必经最高峰,每个点贡献为 hx

fx,i=frsx,i+(xl+1)×hx

可以把 DP 数组放到线段树上,然后 i1,i2 的情况就可以通过继承和单点赋值快速更新,但是 i3 操作有取最值操作,无法快速更新

i3 有一个很重要的性质:i 越小,开会点在左侧所需代价一定越来越小,i 越大,开会点在右侧所需代价也一定越来越小,拥有单调性。

二分找到这两条一次函数的交点,交点之前使用左侧的 DP 方程更新,交点之后使用右侧的 DP 方程更新。

P6717 [CCO2018] Boring Lectures

问题相当于求两个距离不大于 k 的数对的和的最大值

我们把修改改为先删除再进行插入的操作,对于插入操作我们使用线段树在左端点维护每个区间的答案

维护区间最大的最大值+次大值,区间最值即可更新答案。

咋删?不好删,那么就不删,直接离线然后线段树分治即可

P4581 [BJOI2014] 想法

...?这啥神秘题目

一眼考虑随机化,这不随机化还能咋做,毕竟只需要以比较高的概率回答的比较准确即可。

我们首先考虑给每个入度为 0 的点都随机赋予一个权值,,求出每个点能够返回到的入度为 0 的点的最小权值,

权值的期望是 随机值域k+1

容易发现单次求的复杂度是 O(n+m) 的,我们直接暴力求很多次然后取平均值即可。

李华与变色龙

注意到 k40,向左走的变色龙遇到向右走的变色龙后认为是变成了 (a+b)modk,而向右走的变色龙颜色不变。

我们从右往左枚举每一只向右的变色龙,设两只中间的距离为 val,则答案(每个颜色)都要加上 val2×ai,其中 ai 为颜色 i 的向左的变色龙初始位置在当前枚举的向右的变色龙右边的数目。

这样复杂度 O(nk) 可以通过。

Luogu Submission .

笑熬浆糊

咕了先

饼干

容易发现无解当且仅当有一项大于总和的一半或者总和为奇数

找到众数去优先消,同时保证解的存在性不被破坏即可,可以通过本题

狂人日记

打表找规律发现 q(n)=2k1,注意到 t2s1 时答案为 0s 为任意整数。问题转化为求 [1,m] 中 popcount 为 sx 的数量,枚举 xm 的 LCP,这样的 x(njsi)

倒卖文物

妈的这题面诗人握诗,出题人自己看得懂吗

image

fi,j 表示前 i 种货币和为 j 的方案数,设第 i+1 种货币的面值为 di

可以发现一个性质:

  • 如果 jm(modd)ij 用不到

因此我们设 gi,j 表示 fi,{mmodbi}+jdi

我们让 ti 表示 gi,j 最后一个非零的 jt20b,可以直接计算

这里需要证明,过程我不写了太墨迹

Constrained Nim

显然是博弈论,显然要用 SG 函数,没有限制的话显然对于 SG(xi)=xi

那么加上限制之后会有若干个特殊点和若干段 y=x+k 的一次函数。

没有限制的点值是前面的最大值加 1,而有限制的点可以考虑维护每个 SG(x) 的出现次数,不断删掉被禁止的 x,找到最小的删没了的 SG(x) 就是当前的 SG 值。

直接维护 SG(x) 不行吗,但发现只维护特殊点的就行,其他地方均为 1

汉谟拉比

虽然朴素分组背包理论不可过,但是卡常可过。

P10218 [省选联考 2024] 魔法手杖

魔怔题

看到最大化,想到贪心

从高到低确定每一位,首先决定这一位能不能是 1,同时维护变量 ansx

对于 ai 只考虑已经决策过的位 ai xor x>ans 确定它到底属于 S1 还是 S2,剩下的是 =ans 的,可以发现这一部分在 trie 树上是一棵子树,递归求解。

假设当前是 u,下一位 ans 选择 1x 也选择 1,则 u 右子节点全部需要加到 S1 里面,需要判断 b 的和是否超过 m,左子节点也需要递归解决,判断最坏情况下是否有解,即 x 剩下的位都是 1ans 剩下的位都是 0 是否满足 minaS1{a+x}ans

x 选择 0 的情况是对称的,如果 ans 下一位不可能选择 1,那就只有选择 0

这个时候当 x=1 的时候,u 的左子树可以直接加入 S2,右子树需要递归求解,x=0 同理。

回転寿司

区间操作还有超大时限考虑分块。

观察发现一次询问的答案一定是 [l,r] 内的最大值

考虑分块,为每个块都维护大根堆,遇到块时将 A 加入当前块的堆,再将 A 设为堆内最大值并弹出。

对于散块同时为每个块再维护一个小根堆代表块内询问的数,暴力重构堆即可。

B=n 即可,可以通过

P2490 [SDOI2011] 黑白棋

posted @   Vsinger_洛天依  阅读(108)  评论(13编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示