JOISC 乱做

代码可能后面补补。

JOISC 2020

D1T1 Building 4

有显然的 \(O(n^2)\) DP,大力猜测状态里 A 的个数这一维对于合法的状态是一个区间,就可以 \(O(n)\) 了。
不太会证,已经过 C++ 核实

D1T2 Hamburg Steak

感觉,没啥想法,好像有很多随机化过了。

正解做法感觉不算很阳间,不太会想这种。

首先考虑 1 维情况,这是一个很经典的贪心,区间右端点升序贪过去就好了。
对于原问题,我们考虑什么条件之下才能转化成一维问题:所有矩形在 x 轴或者 y 轴的投影的交非空。
我们可以保证这一维一定选交集,另一维就是一维问题了。

考虑无法被上述方法解决的情况是什么。考虑四条边界线,\(A=\min R_i,B=\max L_i,C=\min U_i,D=\max D_i\)
那么 \(A<B,C<D\) 和所有矩形在任意一维的投影交为空等价。
我们考虑最优解的形态,答案里一定有四个点(可重合)满足 \(x=A,x=B,y=C,y=D\)

那么显然 \(k<4\) 的情形下,一定会重合,我们可以大力枚举 \(O(4^k\times n)\) 的复杂度完成。

对于 \(k=4\) 我们也可以进行这样的搜索,找到答案就做完了,我们进一步讨论没找到答案的情况。

考虑剩下的情况四条边界每条边界上有一个点,试图使用 2-SAT 刻画问题,可以大常数 \(O(n)\) 解决。

D1T3 Sweeping

经典的,在 CTT 2022 再次考察了类似的技巧。

首先考虑没有加点的情形。操作将得到一条右下轮廓线,考虑继续操作不会改变轮廓线上点的相对顺序,直接使用数据结构维护轮廓线。
那么查询我们只需要在操作的时候找到所有新加入轮廓线的点就容易查询每个点的坐标了。

对于有加点的情形我们把点当作时间维,对操作线段树分治,多一个 \(\log\) 就做完了。

D2T1 Chameleon’s Love

考虑询问两个元素能得到什么信息,当两条龙颜色相同或者有恋爱关系可以被我们区分出来。
由于龙不会爱和自己颜色相同的龙,所以将上述两种关系连出无向边后,每个点要么度数为 1 要么度数为 3。
度数为 1 的点直接就是一对颜色相同的龙。考虑怎么区别出度数为 3 的三条边。

我们观察一个度数为 3 的点的 3 中不同查询(每次查自己和两个和自己有边的点),我们可以区分出自己指出去的那条边。
当所有指出去的边都被区分出之后,我们就可以找到颜色相同的边了。这部分只需要至多 \(2n\) 次询问。

考虑得到边的关系比 \(n^2\) 更优的做法。交互题肯定先考虑二分。
如果我们提前知道每条龙的性别,那么很容易二分,但是我们不知道性别要咋做?

注意到图肯定是二分图,我们增量的确定边,随便给前缀二分图染色保证每部图中都没边就行了,这部分是 \(O(n\log n)\) 次询问。

询问次数上界很松,容易通过。

D2T2 Making Friends on Joitter is Fun

思维难度很低啊,但是实现起来有点怪。大致肯定是启发式合并,编具体细节比较麻烦。

时间复杂度 \(O(n\log^2 n)\)

D2T3 Ruins 3

pjudge 搬了这题,感觉很困难。

D3T1 Constellation 3

存在一些数据结构做法:笛卡尔树树剖转移 DP。

但是还有非常阳间的做法。

D3T2 Harvest

考虑一个人吃到某个苹果后,下一个将吃到该苹果的人是哪一个,这个关系会形成一个基环树。
而每一个苹果第一次被谁吃关系也加上,仍是基环树。

考虑如果询问基环树中,非环上的点,只需要考虑其子树中的苹果其是否能吃到,这是一个二维偏序。

如果询问环上的,考虑把贡献拆一拆,也是一个二维偏序。

感觉好难写啊,写不动。

D4T1 Capital City

一个比较复杂的做法是树剖优化建图跑 tarjan,求出每个 SCC,把没有出度的最小 SCC 大小求出来就行了。

更简单的做法可以考虑点分治,钦定重心的颜色必须选,然后加入在已选颜色之间的新颜色,如果颜色中有点在该次分治之外,那么这一层分治没有合法解,否则收敛时计入答案即可。

D4T3 Treatment Project

JOISC 2022

D1T1 jail

容易想到结论:

若有解,那么存在一种方案使得每次移动完一条完整的路径

考虑链的情形,若两条路径有包含关系那么一定无解,有相交且方向相反也一定无解

除上述两种情形外显然有解,也容易构造

考虑回到树上,若开头提到的结论成立,怎么做?

那么只要有一组合法的顺序走每一条路径即可

对于两条路径 \(a,b\),若 \(b\) 途径 \(a\) 起点,那么 \(a\)\(b\) 先走;若 \(b\) 途径 \(a\) 终点,那么 \(a\)\(b\) 后走

我们不太困难的得到上述必要条件,容易发现其也是必要的(随便归纳下即可证明)

那么问题变成树上路径向点连边/点向树上路径连边,求 SCC

考虑树剖后线段树优化建图即可,复杂度 \(O(n\log^2n)\)

至于第一个结论的正确性:不会证,润了

D1T2 kyoto

D1T3 misspelling

考虑一条限制 \(T_u\leq T_v\) 实质上是限制 \(S[l,r-1],S[l+1,r],(l=\min(u,v),r=\max(u,v))\) 的大小关系

不妨考虑 \(S[l,r-1]\leq S[l+1,r]\) 的情况

  1. 区间 \([l,r]\) 全为同一字母(取等)
  2. 从前往后第一个不同的字母比 \(S_l\) 大(不取等)

设计一个 dp

\(f_{i,c}\) 表示考虑完从 \(i\) 开始的后缀且 \(S_i=c\) 的合法 \(S\) 填法(仅考虑 \(l\)\(i\) 后的限制)

考虑枚举 \(i\) 后第一个不为字符 \(c\) 的位置 \(j\) 进行转移

考虑怎样处理限制,合法的 \(j\) 应当满足所有 \(l<j,j\leq r\) 的限制区间对 \(S_j,S_i\) 的大小关系要求相同

若有要求则只能转移一边,无要求两边均可转移(\(S_j<S_i,S_j>S_i\)

容易得到一个 \(O(nm+26n^2)\) 的做法:对每个 \(i\) 枚举所有限制区间,分两种大小关系要求差分覆盖区间(\([l+1,r]\)),\(j\) 被某种要求覆盖到则需满足该要求

稍加分析即可发现任意一个 \(j\) 仅在一段 \(i\) 的后缀合法,容易直接用一个单调栈维护

复杂度 \(O(26n+m)\)

D2T1 copypaste3

观察到可以多次复制剪贴板内的内容,不太好使用 SAM/AC 自动机之类的结构描述状态

考虑直接进行区间 dp

\(f(i,j)\) 表示 \(X=S[i,j]\) 时,不考虑 \(Y\) 是啥(之后不会再用这个 \(Y\))的最小代价

  1. 使用操作 A :转移到 \(f(i,j+1)\)

  2. 考虑由于我们可能先拼出一个后缀,再将后缀放入剪贴板中多次复制,为了便于操作 C 的处理,考虑在串前加字母(等价于对之前某一步先做一个操作 A):转移到 \(f(i-1,j)\)

  3. 考虑钦定 \(S[i,j]\) 作为剪切板里的串,将使用若干次,由于转移 1和转移 2,我们可以钦定转移到的串以 \(S[i,j]\) 开头,以 \(S[i,j]\) 结尾

    那么考虑预处理出一个 \(nxt(i,j)\) 表示不与 \([i,j]\) 重叠的接下来第一个 \(S[i,j]\) 的出现位置,我们可以直接暴力跳 \(nxt\) 进行转移,复杂度为调和级数

总复杂度 \(O(n^2\log n)\)

D2T2 flights(通信)

D2T3 team

考虑从小到大扫 \(X_i\),保证其余两者的 \(X\) 值比扫描当前值小

仅考虑剩余两者的 \(Y,Z\) 维,呈 \((y_1,z_1),(y_2,z_2),y_1>y_2,z_1<z_2\)

考虑在加入一组 \((y_0,z_0)\) 时计算其最优的配对(\(y\)\(y_0\) 小中 \(z\) 最大的,反之类似)

将两对合成一对 \((y_{max},z_{max})\) 丢进数据结构里,扫描时查询数据结构里 \(y_{max}>y_{lim},z_{max}>z_{lim}\) 的最大 \(y_{max}+z_{max}\)

容易使用树套树做到 \(O(n\log^2 n)\)

D3T1 device2(通信)

D3T2 sprinkler

小清新题

注意到 \(D\leq 40\),仅需单点询问,考虑打 tag,讨论下怎么不重不漏的打 tag 即可

为了避免处理边界,可以将树往上连 40 个虚点

D3T3 sugar

D4T1 dango3(交互)

小清新交互

想到分治就会做了,考虑每次将 \(m\) 组团子分成两边各 \(\dfrac m 2\) 组团子,容易以 \(nm\) 次询问完成

询问次数 \(nm\log m\),恰好通过 50000

D4T2 fish2

D4T3 reconstruction

考虑若 \(w_1\)\(t\) 时刻比 \(w_2\) 劣,那么 \(X\geq t\) 均满足 \(w_1\)\(w_2\)

这意味着一条边仅在一个时间区间里出现在 MST 里

我们考虑先求出 \(X=0\) 时的 MST,那么之后非树边将进行至多 \(m\) 次替换

考虑直接将所有边按初始权值升序排序,从前往后进行替换,由于 \(n\) 很小,每次可以暴力找到生成树上替换掉的路径上最小的边(最先被偏序),在时间轴上记录一个一次函数的贡献即可

容易发现虽然替换的时间顺序可能不全是从前往后,但有关的部分的顺序一定是对的

时间复杂度 \(O(nm+q)\)

posted @ 2023-05-06 12:07  juju527  阅读(166)  评论(5编辑  收藏  举报