Short But Scary

正解的离线分治+虚树的做法太神奇...搞不到

搞一个菜一点的ddp写写,结果调了200年,下次一定写树剖不写lct了,太难调了...

大概就是按sub2那样维护

你每个重链开一个线段树,然后链头把贡献扔给别的重链,然后每次在链上二分位置查一个和差不多了

然后可以拿lct写

但你得搞清楚翻转的时候要翻转的东西比较多,细节也比较多,异常的难写...

算了懒得说了,给我毒瘤死了...


Code:

#include <cstdio>
#include <cctype>
#include <algorithm>
#define ls ch[now][0]
#define rs ch[now][1]
#define fa par[now]
const int N=1e5+10;
template <class T>
void read(T &x)
{x=0;char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
int head[N],to[N<<1],Next[N<<1],cnt;
void add(int u,int v)
{to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int n,m;
int ch[N][2],par[N],tag[N];//翻转标记
struct koito_yuu
{int siz,is,lef,dat,si;//实际大小,子树全是,最左边的点是否是,与父亲关系,虚儿子贡献
}yuu[2][N];
int s[N],tot;
bool isroot(int now){return ch[fa][0]==now||ch[fa][1]==now;}
int identity(int now){return ch[fa][1]==now;}
void connect(int f,int now,int typ){ch[fa=f][typ]=now;}
void Reverse(int now)
{tag[now]^=1;std::swap(yuu[0][now],yuu[1][now]);
}
void updata(int now)
{for(int k=0;k<=1;k++){yuu[k][now].is=(yuu[k][ls].is&&yuu[k][now].dat&&yuu[k][rs].is);yuu[k][now].siz=yuu[k][ls].siz;if(ls){yuu[k][now].lef=yuu[k][ls].lef;if(yuu[k][ls].is&&yuu[k][now].dat){yuu[k][now].siz+=yuu[k][now].si+1;if(yuu[k][rs].lef) yuu[k][now].siz+=yuu[k][rs].siz;}}else{yuu[k][now].lef=yuu[k][now].dat;yuu[k][now].siz+=yuu[k][now].si+1;if(yuu[k][rs].lef) yuu[k][now].siz+=yuu[k][rs].siz;}}
}
void pushdown(int now)
{if(tag[now]){if(ls) Reverse(ls);if(rs) Reverse(rs);tag[now]=0;}
}
void Rotate(int now)
{int p=fa,typ=identity(now);connect(p,ch[now][typ^1],typ);if(isroot(p)) connect(par[p],now,identity(p));else fa=par[p];connect(now,p,typ^1);updata(p);updata(now);
}
void splay(int now)
{while(isroot(now)) s[++tot]=now,now=fa;s[++tot]=now;while(tot) pushdown(s[tot--]);now=s[1];for(;isroot(now);Rotate(now))if(isroot(fa))Rotate(identity(now)^identity(fa)?now:fa);
}
void access(int now)
{for(int las=0;now;las=now,now=fa){splay(now);for(int k=0;k<=1;k++){if(yuu[0][rs].lef)yuu[k][now].si+=yuu[0][rs].siz;if(yuu[0][las].lef)yuu[k][now].si-=yuu[0][las].siz;}rs=las;updata(now);}
}
void dfs(int now,int f)
{yuu[0][now].is=yuu[0][now].lef=yuu[0][now].dat=1;//yuu[1][now].is=yuu[1][now].lef=yuu[1][now].dat=1;for(int v,i=head[now];i;i=Next[i])if((v=to[i])!=f)par[v]=now,dfs(v,now),yuu[0][now].si+=yuu[0][v].siz;yuu[0][now].siz=yuu[0][now].si+1;yuu[1][now].si=yuu[0][now].si;yuu[1][now].siz=yuu[0][now].siz;
}
void modi(int u)
{access(u);splay(u);Reverse(u);
}
int query(int now)
{pushdown(now);if(!rs){if(yuu[0][now].dat&&ls) return query(ls)+yuu[0][now].si+1;return yuu[0][now].si+1;}if(yuu[0][rs].is){int ret=yuu[0][now].si+1+yuu[0][rs].siz;if(yuu[0][now].dat&&now!=1) ret+=query(ls);return ret;}return query(rs);
}
int qry(int u)
{access(u);splay(u);return ((yuu[0][u].dat&&u!=1)?query(ch[u][0]):0)+yuu[0][u].si+1;
}
int main()
{freopen("scary.in","r",stdin);freopen("scary.out","w",stdout);yuu[1][1].dat=yuu[0][0].is=yuu[1][0].is=1;read(n),read(m);for(int u,v,i=1;i<n;i++) read(u),read(v),add(u,v),add(v,u);dfs(1,0);for(int op,u,v,i=1;i<=m;i++){read(op);if(op==1){read(u),read(v);modi(u),modi(v);}else{read(u);printf("%d\n",qry(u));}}return 0;
}

2019.3.25

转载于:https://www.cnblogs.com/butterflydew/p/10597011.html

Short But Scary 解题报告相关推荐

  1. USACO Training Section 1.3 Calf Flac 解题报告AC代码

    解题报告: 主要方法是生长法,考虑每一位的左右各有多长的回文串,输出最长的那个,比较好想--不过要注意区分字串的奇偶. 其他实现细节看代码里的注释吧-- AC代码: /* ID: yuanmz91 P ...

  2. uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)

    线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报  分类: ...

  3. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  4. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...

  5. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  6. 解题报告(十三)中国剩余定理(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  7. 解题报告(四)生成函数(ACM/ OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  8. 解题报告(八) prufer 序列与 Cayley 公式(ACM / OI)超高质量题解

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  9. 解题报告(一)E、(BZOJ4589)Hard Nim(博弈论 + FWT)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  10. 解题报告(五)组合计数(ACM / OI)超高质量题解

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. oracle11g ora 29927,【案例】Oracle内存泄漏 进行10046跟踪分析07445导致数据库宕机
  2. 计算机科学基础知识(六)理解栈帧
  3. 两个排序数组的中位数(4.Median of Two Sorted Arrays)
  4. 美国科技三巨头的财报为何集体爆表?原因在这里
  5. python完全支持面向对象编程_[Python] 类与面向对象编程
  6. php系统函数代码,PHP自定义函数+系统函数库(代码示例)
  7. 数据可视化 信息可视化_可视化哲学的黎明
  8. GitHub(从安装到使用)
  9. centos7安装Hive2.3.0
  10. 帮助您快速开始下一个移动APP应用模板、UI设计
  11. 选择对话框 android_Android日期时间选择器对话框
  12. CSS3——CSS行内元素和块级元素的转换
  13. 找到好东西,可以显示最忙碌的java线程的脚本
  14. 生命,因追逐梦想而精彩
  15. 【H5/JS】游戏常用算法-碰撞检测-包围盒检测算法(2)-矩形
  16. [笔记分享] [Hardware] MSM8x60 User Guide study report
  17. 有方便记笔记的手机便签app吗?
  18. 【论文分享】Chopped Symbolic Execution
  19. 流水账php,11-12流水账
  20. 用python编写一段分析txt文件中文字情绪的程序

热门文章

  1. Leaflet地图初始化地图(谷歌+天地图混合图层)
  2. DS博客作业06——图
  3. datav可视化大屏使用教程
  4. 离职前需要注意的事情?
  5. 关于a:hover span和a span:hover的区别
  6. 寒霜朋克计算机丢失,寒霜朋克无法启动运行解决方法 寒霜朋克不能运行怎么办?...
  7. 从360、QQ之争看腾讯的无耻
  8. Go语言泛型工具go2go
  9. 漫反射(diffuse reflection)
  10. C# LINQ 语法备忘-刘欣