专栏文章

NOIP2024 记录

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqvyrfe
此快照首次捕获于
2025/12/04 11:38
3 个月前
此快照最后确认于
2025/12/04 11:38
3 个月前
查看原文

edit

贪心 in 1h,感觉挺对。
一个极大的连续 11 段中的所有位置可以任意交换,00 的位置只能固定。依据题面可以直接将 s1,s2s_1,s_2 划分成若干段,每段内可以随意排列,记录每段的 l,r,c0,c1l,r,c_0,c_1 分别表示左右端点、0/10/1 的数目。
直接贪,如果前面位置能够匹配就一定直接匹配完,这样不会有本能匹配的最后匹配不了。维护两个指针 i,ji,j 代表匹配到 s1s_1 的第 ii 段和 s2s_2 的第 jj 段。记 x=min(c0(i)+c0(j)),y=min(c1(i),c1(j))x=\min(c_0(i)+c_0(j)),y=\min(c_1(i),c_1(j)),这两段之间的匹配对答案的贡献是 x+yx+y
  1. ri=rjr_i=r_jrir_i 之前的地方全部做完,ii+1,jj+1i\to i+1,j\to j+1
  2. ri<rjr_i<r_j,这次处理的长度 len=rimax(li,lj)+1len=r_i-\max(l_i,l_j)+1。考虑如果贡献小于 lenlen,有一些位置不能匹配。若 x<c0(i)x<c_0(i),则这部分有一些在 ii 中为 00 的位置只能用 jj 中的 11 填,故令 c1(j)c1(j)c0(i)+xc_1(j)\to c_1(j)-c_0(i)+x;否则 ii 中的一些 11 只能用 jj 中的 00 填,c0(j)c0(j)c1(i)+yc_0(j)\to c_0(j)-c_1(i)+y。最后 ii+1i\to i+1
  3. ri>rjr_i>r_j 同理。
时间复杂度 O(Tn)O(Tn)

assign

签到题,小于 T1,1h。
特判掉 ci=cj,didj,ans=0c_i=c_j,d_i\neq d_j,ans=0v=1,ans=1v=1,ans=1
乘法原理,讨论每个位置 ii 的贡献系数,全部乘起来就是答案:
  1. i,i+1i,i+1 都被钦定:ai=xia_i=x_ibi=xi+1b_i=x_{i+1},否则 bib_i 任意,贡献系数为 v(v1)+1v(v-1)+1
  2. ii 被钦定,i+1i+1 未钦定:所有 (ai,bi)(a_i,b_i) 的选取方法都合法,v2v^2
  3. ii 未钦定,i+1i+1 已钦定:所有 (ai,bi)(a_i,b_i) 的选取方法都合法,v2v^2
  4. i,i+1i,i+1 都未钦定,v2v^2
可以将连续的全被钦定/全未钦定的合成一段,快速幂算出整段的贡献。唯一的问题是对于 100110\cdots01 的区间 [i,j][i,j],如果 ai=xia_i=x_i 并且一路钦定下来,bj1b_{j-1} 必须等于 xjx_j 而不能任选。所以这个区间的方案数是 (v2)jivji+vji1(v^2)^{j-i}-v^{j-i}+v^{j-i-1}O(Tmlogn)O(Tm\log n)

traverse

还不会。

query

一个扫描线 + 线段树能做的东西以为要树套树,没有冲出链的性质,遗憾离场。
无关正解的暴力:只有长度等于 kk 的区间有用。一个结论是一个点集所有点的 LCA 是其中 dfn 最小的和 dfn 最大的两个点的 LCA。枚举 lenk+1len-k+1 个区间和答案取 max\max,可以 dfs 序/欧拉序 O(1)O(1) LCA 做到 O(nlogn+nq)O(n\log n+nq)
考虑正解。上面的瓶颈在于枚举区间,没有前途。考虑一个点 uu 能否作为 LCA 贡献 depudep_u 到询问区间。考虑预处理出所有 LCA 为 uu 的极长区间。进行一个 dsu on tree,把所有儿子的区间集合合并到 uu,启发式合并 set,如果有两段区间相邻就合成一个,合成区间时顺便把这些有贡献的区间记录下来(没有和其它区间合并的区间 LCA 肯定在某个儿子的子树里,不需要重复记)。这样有贡献的区间就只有 nn 个单点和 n1n-1 个其它的区间。这部分 O(nlog2n)O(n\log^2 n)
接下来就是有一些贡献区间 (l,r,w)(l,r,w) 和询问区间 (L,R,k)(L,R,k)(l,r,w)(l,r,w)[L,R,k][L,R,k] 有贡献当且仅当 [L,R][l,r]k|[L,R]\cap[l,r]|\ge k。分类讨论:
  • liL,riL+k1l_i\le L,r_i\ge L+k-1
  • riR,liRk+1r_i\ge R,l_i\le R-k+1
  • rili+1k,li[L,Rk+1]r_i-l_i+1\ge k,l_i\in[L,R-k+1]
前两个直接二维数点,树状数组维护前/后缀 max;最后一个将贡献区间和询问区间按照 rili+1r_i-l_i+1kk 从大到小排序,贡献区间的 wiw_i 挂在 lil_i,询问区间 max 容易线段树解决。这部分 O((n+m)logn)O((n+m)\log n)
总时间复杂度 O(nlog2n)O(n\log^2 n),可以通过。其实 dsu on tree 部分合并区间还能通过并查集维护做到单 log,O(nlogn)O(n\log n)

评论

0 条评论,欢迎与作者交流。

正在加载评论...