Atcoder abc237
https://atcoder.jp/contests/abc237/tasks
G - Range Sort Query
给你一个1-N的排列
Q次操作, 每次指定区间排成指定升序/降序
问所有操作结束后,X的位置
范围
n 2e5
q 2e5
8s
1024mb
我的思路
先考虑特殊情况
X=1
那么只用持续跟踪它的位置就好了, 每次有覆盖的区间,计算新位置
而如果X=2
会发现, 每次排序与,1是否在其中有关, 维护量变成2个位置
这样下去3,就是3个位置
x就是x个位置
但其实一想, 整个排序,对X位置有影响的可以只考虑< X的个数, 或者说只考虑> x的个数
那么每次对含X的排序 = [l…r] 变成 < x的个数
,X,> x的个数
啊不就是区间查询和连续区间修改
segment tree + lazy tag 就可以了?
代码
https://atcoder.jp/contests/abc237/submissions/34842993
1 |
|
ftiasch (摘要表示)
https://atcoder.jp/contests/abc237/submissions/30817031
对于连续的一段 只需要记录开头的位置和内容, 再配上map+lower_bound 即可, 相当于表示从 当前位置到下一个位置之间都是val
显然每次操作完后 不多于3个,
假设每次操作是对i个段, +t, +r
t是对原来的切割[0~2]
r是剩余的段个数[1~3]
总的操作代价是 (i+t+r)
对总体段的改变是 减少 (i-(t+r))个
有 sum(i-(t+r)) <= n
sum(i+(t+r)) == sum(i-(t+r) + 2(t+r)) <= n + 2(t+r)q <= n + 10q
均谈O(n+q)
Ex - Hakata
https://atcoder.jp/contests/abc237/tasks/abc237_h
小写字母的字符串S
选出尽量多的 回文子串 集合T, 问有最多有多少个满足
连续子串是回文串,且不是其它选中的T中的连续子串的回文串的子串
范围
|S| 200
2s
1024mb
我的思路
显然可以先插入#号来不用分类奇偶,以每个点为中心的最长串才有可能是答案
这样我们可以暴力n^2 得到n个候选回文串
问题变成说其中一个是否是另一个的子串
暴力 = n^3 ?
题解
结论1: S中的不同的 回文子串 的个数 $N \le |S|$
证明:
字符串s末尾增加一个字符(s1 = s+char(?)), 至多
产生一个之前不存在的回文串
若新增的字符未出现过, 则多了它自己
若该字符出现过, 那么本身不会是新的, 那么产生的是 [i0….n+1], [i1…..n+1], 这些以n+1结尾的 回文串
注意到 最小的i, 对应的[i….n+1] 包含了其余的[i…n+1]所以其余的都不会是新产生的.
因此一个字符串的不同回文串个数$\le |S|$ 得证
比如 A,B 都是C的子串,你可以选A,B不选C达到更多
所以看成把N个回文看成点,建立DAG,问选最多的点,让任意两点之间没有直接路径
而对于这个DAG,如果有 i->j,j->k,那么必然存在i->k,(传递闭包), 所以根据Dilworth定理, 问题变成最小路径覆盖(选最少的路径, 覆盖所有点)
DAG的选点互斥需要满足 i->j,j->k 则i->k也可以比较大小(存在偏需)
然后可以用二分图最大匹配来做
具体操作
- 求传递闭包就是如果i->j,j->k那么就要有i->k的边,(本题目本身处理时就有不需要额外求)
- 拆点成入点 出点, 变成二分图
因为每个点的出入度在二分图最大匹配中为1或0, 所以对应原拓扑图一定是多个链(匹配的方案一定对应原图的一个方案)
又因为可以看成原图每个点是一个链,每次连接就让链数量减一, 要尽可能多的减1
而这正好一个连接对应二分图的一个匹配, 所以
最小覆盖 = 点数 - 二分图最大匹配数
代码
https://atcoder.jp/contests/abc237/submissions/34871954
1 |
|
总结
G
线段树数据结构,没啥难的
Ex
- 字符串与其不同回文串的个数关系 $\le |S|$ 这个性质看上去还是很神奇
- 偏序图中选两两无无法比较的点的最大点集的Dilworth定理
- 偏序图的最小链覆盖和二分图的关系
emmmmm 二分图可以只做一侧点的vis吗?
参考
https://repub.eur.nl/pub/23112/EI2011-13.pdf
https://www.sciencedirect.com/science/article/pii/0012365X79901572