洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)
你谷无题解于是来补一发
随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述。。。。。。
于是来想想怎么利用题目的性质,把复杂度降下来。
首先,每个点的输出状态只有\(0/1\),于是每个点的总状态也非常有限,可以根据权值为\(1\)的儿子数量\(0-3\)分为四种,记为该点的点权。
我们都会模拟暴力过程——先改叶子节点(先默认为\(0\)改为\(1\)),如果它的父亲此时权值为\(1\)的儿子数量从原来小于\(0\)的变成大于\(0\)的,那么父亲的权值也要改。以此类推,直到有一个节点输出状态没有变化,那么它的所有祖先肯定不会变。
通过模拟我们发现,每次修改的一定是一段自底向上的连续区间!
接着也就不难想到,只有当点权为\(1\)时,才能通过修改点权变成\(2\),使输出由\(0\)变成\(1\),从而继续引发祖先的变化。那么我们需要知道的就是,对于每一个叶子节点,它自底向上的连续一段点权为\(1\)的部分。
再讨论叶子节点\(1\)改\(0\)的情况,同理也可以发现我们还要维护自底向上的连续一段点权为\(2\)的部分。
这个可以树剖(有很多维护法,都是\(log^2\)的,跳链和链修改都有\(log\))正在学树剖,先留个坑,到时候再补。。。
当然可以LCT,讲两个维护法。第一种是用bool值维护区间是否有权值不为\(1/2\)的点,每次Splay上二分查找最深的不为\(1/2\)的点,把它伸展上来,右子树做区间修改,这个点做单点修改。
因为写二分比较麻烦(其实就是几行的事),所以还不如直接维护最深的不为\(1/2\)点的编号,找都不用找。直接把它伸展上来。修改同上。容易发现这里的LCT连换根都不要。
两种写法都需要注意特判:如果整条从根到叶子的链没有一个不为\(1/2\)的点,直接做区间修改。
分享一个naive的错误——蒟蒻默认父节点的编号比子节点小,然后pushup直接取\(\max\),竟然获得了95分?!调了半天本机对拍又是全AC(自己的数据生成器肯定是父节点的编号比子节点小啦。。。)
刚掉这题后还收获了一点小经验——不要给LCT永久化地贴上常数大的标签!因为少一个\(log\),所以\(n\)越大越有优势(这题\(5*10^5\)),还不用reverse。看看统计,就知道什么叫LCT全方位(时间、空间、码量)完爆树剖的感觉了哈哈哈哈hhhh
https://www.luogu.org/recordnew/lists?uid=&pid=P4332&status=&sort=1
https://loj.ac/problem/2187/statistics/fastest
#include<cstdio>
#include<algorithm>
#define RG register
#define I inline
#define R RG int
#define lc c[x][0]
#define rc c[x][1]
#define G if(++ip==ie)if(fread(ip=ibuf,1,L,stdin))
using namespace std;
const int N=5e5+9,M=1.5e6+9,L=1<<19;
char ibuf[L],*ie=ibuf+L,*ip=ie-1;
int n,f[M],c[N][2],t[N],n1[N],n2[N],v[M],q[M],d[N];
I int max(R x,R y){return x>y?x:y;}
I int in(){
G;while(*ip<'-')G;
R x=*ip&15;G;
while(*ip>'-'){(x*=10)+=*ip&15;G;}
return x;
}
I bool nrt(R x){
return c[f[x]][0]==x||c[f[x]][1]==x;
}
I void up(R x){//先右儿子再自己最后左儿子
if(!(n1[x]=n1[rc])&&!(n1[x]=x*(v[x]!=1)))n1[x]=n1[lc];
if(!(n2[x]=n2[rc])&&!(n2[x]=x*(v[x]!=2)))n2[x]=n2[lc];
}
I void dn(R x,R tg){//被区间修改的要么都是1要么都是2,直接反转信息
v[x]^=3;swap(n1[x],n2[x]);t[x]+=tg;
}
I void all(R x){
if(nrt(x))all(f[x]);
if(t[x])dn(lc,t[x]),dn(rc,t[x]),t[x]=0;
}
I void rot(R x){
R y=f[x],z=f[y],k=c[y][1]==x,w=c[x][!k];
if(nrt(y))c[z][c[z][1]==y]=x;
f[f[f[c[c[x][!k]=y][k]=w]=y]=x]=z;up(y);
}
I void sp(R x){
all(x);
for(R y;nrt(x);rot(x))
if(nrt(y=f[x]))rot((c[f[y]][0]==y)^(c[y][0]==x)?x:y);
up(x);
}
I void ac(R x){
for(R y=0;x;sp(x),rc=y,up(y=x),x=f[x]);
}
int main(){
n=in();R he,tl=0,i,x,tp,nowrt;//nowrt全局记录根的输出,方便,减小常数
for(i=1;i<=n;++i)d[f[in()]=f[in()]=f[in()]=i]=3;
for(;i<=3*n+1;++i)v[q[++tl]=i]=in()<<1;
for(he=1;he<=tl;++he){//懒得dfs了,直接从下往上拓扑排序预处理
x=q[he];if(x<=n)up(x);
v[f[x]]+=v[x]>>1;
if(!--d[f[x]])q[++tl]=f[x];
}
nowrt=v[1]>>1;
for(R q=in();q;--q){
tp=(v[x=in()]^=2)-1;//记录当前变化类型
ac(x=f[x]);sp(x);
if((~tp?n1:n2)[x]){
sp(x=(~tp?n1:n2)[x]);
dn(rc,tp),up(rc);
v[x]+=tp;up(x);
}
else dn(x,tp),up(x),nowrt^=1;//注意特判
putchar(nowrt|'0');putchar('\n');
}
return 0;
}
洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)的更多相关文章
- 洛谷P4332 [SHOI2014]三叉神经树(LCT)
传送门 FlashHu大佬太强啦%%% 首先,我们可以根据每一个点的权值为$1$的儿子的个数把每个点记为$0~3$,表示这一个点的点权 先考虑一下暴力的过程,假设从$0$变为$1$,先更改一个叶子结点 ...
- 洛谷4322 SHOI2014 三叉神经树(LCT+思维)
好久之前做的题了QWQ 现在来补一发博客 一道神仙题啊..qwq 首先,我们可以看出来,我们如果对于每个点维护一个\(val\),表示他的直系儿子中有几个表现为1的. 那么\(val[x]>&g ...
- 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)
题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...
- 洛谷 P3373 【模板】线段树 2
洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...
- 洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP
洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP 题目描述 著名的电子产品品牌\(SHOI\) 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米 ...
- 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序
题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...
- 洛谷P4338 [ZJOI2018]历史(LCT,树形DP,树链剖分)
洛谷题目传送门 ZJOI的考场上最弱外省选手T2 10分成功滚粗...... 首先要想到30分的结论 说实话Day1前几天刚刚刚掉了SDOI2017的树点涂色,考场上也想到了这一点 想到了又有什么用? ...
- 洛谷P4299 首都(BZOJ3510)(LCT,树的重心,二分查找)
Update:原来的洛谷U21715已成坑qwq 已经被某位管理员巨佬放进公共题库啦!又可以多一个AC记录啦! 洛谷题目传送门 其实也可以到这里交啦 思路分析 动态维护树的重心 题目中说到国家的首都会 ...
- 洛谷P3345 [ZJOI2015]幻想乡战略游戏(动态点分治,树的重心,二分查找,Tarjan-LCA,树上差分)
洛谷题目传送门 动态点分治小白,光是因为思路不清晰就耗费了不知道多少时间去gang这题,所以还是来理理思路吧. 一个树\(T\)里面\(\sum\limits_{v\in T} D_vdist(u,v ...
随机推荐
- AT2134 Zigzag MST
题面 题解 这个题目主要是连边很奇怪,但是我们可以发现一个性质:权值是递增的. 于是像下图的连边:(加边方式为\((A_1, B_1, 1)\)) 其实可以等价于如下连边: 于是我们将其变成了在环上连 ...
- cmake 添加头文件目录,链接动态、静态库(转载)
来源网址:http://www.cnblogs.com/binbinjx/p/5626916.html 罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目 ...
- 欧拉函数(小于或等于n的数中与n互质的数的数目)&& 欧拉函数线性筛法
[欧拉函数] 在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler’s totient function.φ函数.欧拉商数等. 例如φ( ...
- vue 过滤器基本使用
Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化,例如时间戳格式化. 过滤器可以用在: 双花括号插值 v-bind 表达式 (2.1.0+ 开始支持). 过滤器应该被添加在 JavaSc ...
- 谈谈ThreadLocal的设计及不足
用Java语言开发的同学对 ThreadLocal 应该都不会陌生,这个类的使用场景很多,特别是在一些框架中经常用到,比如数据库事务操作,还有MVC框架中数据跨层传递.这里我们简要探讨下 Thread ...
- 微服务监控zipkin+asp.net core
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 监控目录:微服务监控zipkin.skywalking以及日志ELK监控系列 一.zipkin介绍 zipkin是一种分布式跟踪系 ...
- IOS 上架到App Store被拒的常见问题总结
Guideline 2.3.3 - Performance - Accurate Metadata 2017年11月16日 上午12:52 发件人 Apple 2. 3 Performance: Ac ...
- iphone忘记锁屏密码却记得appleID密码的不保存数据的刷机办法
请注意看清题目再看本文,另外一切后果博主不负任何责任.操作实现环境:原装数据线,拔掉sim卡昨天,iPhone6sp忘记密码被锁定,尝试通过找回手机抹除手机功能后,提示需要手机接入互联网才能实现,而我 ...
- MFS+Keepalived双机高可用热备方案操作记录
基于MFS的单点及手动备份的缺陷,考虑将其与Keepalived相结合以提高可用性.在Centos下MooseFS(MFS)分布式存储共享环境部署记录这篇文档部署环境的基础上,只需要做如下改动: 1) ...
- nginx的access.log文件详解
事实证明,日志文件真的是很重要很重要的.能够帮助我们快速的定位问题,并且知道用户访问的状态,浏览器,Ip,接口地址等,简直可怕.. 一.nginx的access.log(1)对博主而言,日志文件存放在 ...