首页 > 其他分享 >洛谷 P6580 [Ynoi 2019] 美好的每一天~ 不连续的存在 题解

洛谷 P6580 [Ynoi 2019] 美好的每一天~ 不连续的存在 题解

时间:2022-12-19 14:44:06浏览次数:47  
标签:洛谷 分块 题解 线段 合并 Ynoi nlogn 莫队 复杂度

既然是YNOI那肯定是要分块的。先考虑树是一条链的情况,可以直接回滚莫队,对n个节点组成的序列分块。在回滚莫队的过程中,当前维护的区间一共会扩展\(O(n\sqrt n)\)次,每次都是合并了恰好2个连通块。可以用线段树合并对每个连通块维护其中颜色的奇偶性。注意到每次合并,都有其中一个连通块的大小是1,这就保证了复杂度,\(O(n\sqrt nlogn)\)。

然后再来看树不是链的情况。这是再用上面的方法复杂度就假了,因为这时加入一个点可能会合并不止一个连通块。对所有边组成的序列分块也不行,因为线段树合并和撤销的复杂度不能保证。那我们应该对其他什么东西分块才对。

考虑这样一件事情:把节点1~n从左到右排成一行,然后从右到左一个个把节点加入维护的区间,并进行连通块之间的线段树合并。令\(c_i\)表示加入第i个点时,线段树合并内部进行的操作次数。线段树合并的时候不是要递归吗,每次递归都算一次操作。显然,\(\sum{c_i}=O(nlogn)\)。接下来用数组c对1-n组成的序列进行"加权"然后分块跑莫队,也就是把i号点复制\(c_i\)份,形成一个长度\(O(nlogn)\)的序列,然后对它回滚莫队。这时候发现复杂度就对了,不会出现不均匀的情况。

线段树合并常数太大了,考虑使用压位trie。也就是一个类似这样的结构:

时间复杂度还是\(O(n\sqrt nlogn)\)级别的,常数小了不少。

标签:洛谷,分块,题解,线段,合并,Ynoi,nlogn,莫队,复杂度
From: https://www.cnblogs.com/legendstane/p/luogu-p-6580-ynoi-solution.html

相关文章

  • 洛谷 P1712 [NOI2016] 区间
    很多套路糅合在一起的一道题。记\(len_i=r_i-l_i\)。则所求转化为一个有\(m\)个区间的集合\(S\),满足:存在一个\(x\),使得对于所有\(S\)中的区间\(i\),有\(l_......
  • Android Studio使用Mob实现短信验证功能遇到的问题解决
    一、Mob短信验证​​全球领先的数据智能科技平台-MobTech袤博解决​​进行注册登入 登入成功后,点击开发者服务中的短信验证,进入开发者平台填好信息创建成功后显示下图,可以......
  • Ynoi 切(受)题(虐)记录
    防止忘记做法大致按照切题顺序简略写一下思路,同时造福一下社会。(不过我怀疑大概只有我能看懂我自己写的。)缓慢更新。P4119[Ynoi2018]未来日记最初分块。人生第一道......
  • P7710 [Ynoi2077] stdmxeypz 题解
    对@LHFdalao的题解进行一些补充说明。因为他讲的实在是太难懂了。最后在@_•́へ•́╬_dalao的帮助下才勉强知道怎么做。不过他的代码非常简洁易懂,有需求的可以去看......
  • P6877 题解
    前言题目传送门!更好的阅读体验?贪心。内容抄自某校课件。思路部分分这个随便搞都可以,可以二分答案然后建边然后跑二分图最大匹配。正解考虑贪心。这里有一个重要的......
  • P3556 题解
    前言题目传送门!更好的阅读体验?最短路应用。内容抄自某校课件。思路首先想到题目与最短路有关。假如\(a\)到\(b\)的最短路径长度是\(x\),那么对于一个询问是否存......
  • Codeforces Polynomial Round 2022 (Div.1 + Div.2) CF 1774 题解
    A.AddPlusMinusSign如果有偶数个1,显然可以通过加减各一半的方式达到和为0;否则可以达到和为1。需要注意如果序列的第一个数是1,则它的前面只能填加号。时间复杂度\(O(n......
  • Codeforces Polynomial Round 2022 (Div.1 + Div.2) CF 1774 题解
    A.AddPlusMinusSign如果有偶数个1,显然可以通过加减各一半的方式达到和为0;否则可以达到和为1。需要注意如果序列的第一个数是1,则它的前面只能填加号。时间复杂度\(O(n......
  • Codeforces Polynomial Round 2022 (Div.1 + Div.2) CF 1774 题解
    A.AddPlusMinusSign如果有偶数个1,显然可以通过加减各一半的方式达到和为0;否则可以达到和为1。需要注意如果序列的第一个数是1,则它的前面只能填加号。时间复杂度\(O(n......
  • Codeforces Polynomial Round 2022 (Div.1 + Div.2) CF 1774 题解
    A.AddPlusMinusSign如果有偶数个1,显然可以通过加减各一半的方式达到和为0;否则可以达到和为1。需要注意如果序列的第一个数是1,则它的前面只能填加号。时间复杂度\(O(n......