JOISC 2018 题解

没做计算几何题和提交答案题。

JOISC2018 Day1 Construction of Highway 道路建设

注意到题目中的操作相当于就是到根的路径染色,我们离线下来进行树剖,每条重链维护连续段,然后显然均摊会修改 \(O(n\log n)\) 段。我们每次修改时可以取出所有连续段,然后题目问逆序对数,我们对这些连续段跑一次逆序对即可。复杂度 \(O(n^2\log n)\)

https://qoj.ac/submission/104349

JOISC2018 Day1 Tents 帐篷

我们把行/列上的一对看成一组,每一组会消耗一行两列/两行一列。所以我们先枚举我们放几个横对,枚举放几个行对,枚举放几个列对,再枚举放几个单点,式子就长成这样(令 \(g(x)\) 表示 \(\binom{2x}{2;2;...;2}\)

\[\sum_x \binom{n}{x}\binom{m}{2x}g(x)\sum_y \binom{n-2x}{y}\binom{n-x}{2y}g(y)\sum_z \binom{n-x-2y}{z}\binom{m-y-2x}{z}z!4^z \]

把后面的东西拎出来,令 \(F(p,q)=\sum_z \binom{p}{z}\binom{q}{z}z!4^z\),我们把 \(\binom{p}{z}\) 拆了然后再把 \(z!\binom{q}{z}\) 化成 \(q(z-1)!\binom{q-1}{z-1}\),得到 \(F(p,q)=F(p-1,q)+4qF(p-1,q-1)\)。然后就可以 \(O(n^2)\) 做了。

https://qoj.ac/submission/104363

* JOISC2018 Day2 修行 Asceticism

即求欧拉数。

首先二项式反演,钦定有 \(k\) 个小于号,即 \(n-k\) 个上升连续段。一个上升段的 EGF 为 \(e^{z}-1\)\(n-k\) 个段的 EGF 即 \([\frac{z^n}{n!}](e^z-1)^{n-k}=\sum\limits_{i=0}^{n-k} (-1)^{n-k-i}\binom{n-k}{i}[\frac{z^n}{n!}]e^{iz}=\sum\limits_{i=0}^{n-k}(-1)^{n-k-i}\binom{n-k}{i}i^n\)。于是我们可以得到答案为

\[ans=\sum_{k} \binom{k}{m}(-1)^{k-m}\sum_i i^n(-1)^{n-k-i}\binom{n-k}{i}\\ = \sum_i i^n(-1)^{n-m-i}\sum_k \binom{k}{m}\binom{n-k}{i}\\ = \sum_i i^n (-1)^{n+m+i}\binom{n+1}{m+i+1} \]

https://loj.ac/s/1773669

JOISC2018 Day2 最坏记者3 Worst Reporter 3

我们考虑每个人往后走的长度一定是前一个的整数倍。于是我们预处理一下,把长度相同的并起来,然后每次询问暴力查看是否在区间即可。复杂度 \(O((n+q)\log n)\)

https://qoj.ac/submission/104631

JOISC2018 Day3 比太郎的聚会 Bitaro’s Party

看上去不是很好维护,考虑根号分治,暴力维护。我们对于每个点维护能到达它的前 \(B\) 大的点,然后这个是可以直接转移时归并的。然后不能来的点数 \(\ge B\) 的时候就考虑直接暴力做。\(B\) 稍微小一点跑的会比较快。

https://qoj.ac/submission/104697

* JOISC2018 Day3 安全门 Security Gate

对于括号序列串 \(C\),设前缀和 \(S\) 和后缀和 \(T\),假设我们反转的区间为 \([l+1,r]\),令 \(r'=r+1\),那么合法当且仅当:\(S[1,l]\ge 0\)\(T[r',n]\ge 0\)\(S_{r}\le 2S_{l}\)\(S_r-S_l=S_n/2\)。我们对原串进行分类讨论。第一种,原串本身就是合法串,直接 DP。第二种,原串满足 \(S[1,n]\le 0\),但是存在 \(T_i<0\)。第三种,原串满足 \(T[1,n]\le 0\),但是存在 \(S_i<0\)。这两种情况对称。第四种,原串存在 \(T_i<0\) 且存在 \(S_i<0\)

考虑第二三种如何处理。这时我们的决策一定是找到最小的 \(T_i<0\) 的位置 \(x\)(满足 \(x\) 处为右括号),在 \([1,x-1]\) 中取最早出现的 \(S_i\) 最大值的位置作为 \(l\),并贪心找 \(l\) 后面的第一个满足 \(S_r-S_l=S_n\) 的位置 \(r\)。我们令 \(S_l=a\)\(S_n=b\),则 $ S_r=a+b/2$,于是 \(T_{r'}=a-b/2\)。我们 DP \(g_{i,j,k}\) 表示对于 \([1,i]\)\(S_i=j\),前缀最大 \(S_i=k\),那么 \([1,x-1]\) 满足 \(S_l=j\) 的方案数为 \(g_{x-1,0,j}\)。设计 DP \(f_{u,i,j,0/1}\) 表示钦定 \(T_{r'}=u\)\([i,n]\)\(T_i=j\)\(i\) 是否已经在被翻转的区间中(\(i<r\))。而我们限制即 \(f_{i,*,1}=0\) 满足 \(*\neq u\)(因为钦定了 \(r\) 是第一个满足要求的),\(*\le 2u\)(对限制进行化简得到)。然后答案即 \(\sum_{u,i,j} g_{i-1,0,j} f_{u,i+1,2u-2j-1,[2j-u<-1]}\)

然后考虑第四种如何处理。这时我们的决策对于 \(l\) 也是一样的,对于 \(r\) 要满足 \(r'\) 及之后的 \(T\)\(>0\)。但是这需要满足 \(S_l+S_n/2\le S_r\)。但是其实如果我们把整个串翻过来然后左右括号反以下,发现如果正过来不满足这个条件那必然反过来后满足,唯一的问题是 $ S_l+S_n/2=S_r$ 时会算重,减掉就行了。考虑 DP。从 \(r\)\(l\) 走,如果已经经历过 \(T<0\) 的话,那么这之后再出现 \(T_i=u\) 就无所谓了,于是还要加一个 \(f_{i,j,2}\) 表示目前已经经历过 \(T<0\) 了。然后其它都是差不多的。

https://qoj.ac/submission/105912

JOISC2018 Day4 糖 Candies

反悔贪心。用一个链表维护,然后每次把 \(a_i\) 变成 \(a_{pre}-a_i+a_{nxt}\) 即可。需要注意边界的情况,如果处理的是边界的点那么需要直接删掉。

https://qoj.ac/submission/104884

JOISC2018 Day4 图书馆 Library

首先我们 \(n\) 次问询问出第一个元素。然后我们考虑每次找到紧跟着这个元素 \(x\) 后面的那个元素。我们考虑维护一个候选集合 \(S\),每次选 \(S\) 中的一半,问一次 \(S\) 和一次 \(S\cup\{x\}\),就能判断后面那个元素是否在 \(S\) 中。

https://qoj.ac/submission/104885

JOISC2018 Day4 野猪 Wild Boar

每年就总有一道这种题,让人写的痛不欲生。

首先我们考虑对于一条路径,它真正有用的信息只有长度,和首尾两条边是什么。如果我们想要合并两条路径 \(X,Y\),我们只需要 \(X\) 的最后一条边和 \(Y\) 的第一条边不相等。我们维护 \((u,v)\) 之间的五条路径:最短路,钦定首边与最短路不同的最短路,钦定尾边与最短路不同的最短路,钦定首尾边都不同的最短路。然后我们就可以在线段树上维护询问了。

然后就是这些东西怎么求。我的sb做法是:对于每个边 \(s\to t\),记录 \(f_{u,0/1}\) 表示 \(s\) 出发且第一步是 \(s\to t\) 的最短/次短路,且保证次短路的尾边与最短路不同。这个有很多的细节。然后将所有记录下来的路径排序之后从前往后找路径。我的代码距离爆 1G 的内存,只差 0.8M。很危险。

https://qoj.ac/submission/105586

posted @ 2023-05-15 22:56  LarsWerner  阅读(366)  评论(0编辑  收藏  举报