博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ 2759] 一个动态树好题
阅读量:6317 次
发布时间:2019-06-22

本文共 2216 字,大约阅读时间需要 7 分钟。

[BZOJ 2759] 一个动态树好题

首先这是个基环树。

然后根节点一定会连出去一条非树边。通过一个环就可以解除根的答案,然后其他节点的答案就可以由根解出来。

因为要修改\(p_i\),所以我们用\(lct\)

还是有点难写的。

代码:

#include
#define ll long long#define N 30005#define ls ch[v][0]#define rs ch[v][1]using namespace std;inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}const ll mod=10007;ll inv[mod];int n;int k[N],b[N];int p[N];int fa[N],ch[N][2];int rev[N];int A[N],B[N];int val[N];void update(int v) { A[v]=(A[ls]*k[v])%mod; B[v]=(B[ls]*k[v]+b[v])%mod; A[v]=(A[v]*A[rs])%mod; B[v]=(B[v]*A[rs]+B[rs])%mod;}bool isroot(int v) {return v!=ch[fa[v]][0]&&v!=ch[fa[v]][1];}void rot(int v) { int f=fa[v],gr=fa[f]; int sn=v==ch[f][1],son=ch[v][!sn]; if(!isroot(f)) ch[gr][f==ch[gr][1]]=v; ch[f][sn]=son,ch[v][!sn]=f; fa[v]=gr,fa[f]=v; if(son) fa[son]=f; update(f),update(v);}void splay(int v) { while(!isroot(v)) { int f=fa[v],gr=fa[f]; if(!isroot(f)) rot(f==ch[gr][1]^v==ch[f][1]?f:v); rot(v); }}void access(int v) { int tem=0; while(v) { splay(v); rs=tem; update(v); tem=v,v=fa[v]; }}int Find_root(int v) { access(v); splay(v); while(ls) v=ls; return v;}void Link(int v,int f) { splay(v); fa[v]=f;}void Cut(int v) { access(v),splay(v); fa[ls]=0; ls=0; update(v);}void dfs(int v) { if(!v) return ; dfs(ls),dfs(rs);}void work(int v) { access(p[v]); splay(p[v]); int na=A[p[v]]%mod; int nb=B[p[v]]%mod; na=(1-na+mod)%mod; if(!na) { if(!nb) val[v]=-2; else val[v]=-1; } else val[v]=inv[na]*nb%mod;}int query(int v) { int rt=Find_root(v); access(v),splay(v); if(val[rt]<0) return val[rt]; else return (val[rt]*A[v]+B[v])%mod;}void modify(int v) { int top=Find_root(v); Cut(v); k[v]=Get(),p[v]=Get(),b[v]=Get(); update(v); if(Find_root(v)!=Find_root(p[v])) Link(v,p[v]); if(Find_root(top)!=Find_root(p[top])) Link(top,p[top]); work(Find_root(v)),work(Find_root(top));}int main() { A[0]=1; inv[0]=inv[1]=1; for(int i=2;i

转载于:https://www.cnblogs.com/hchhch233/p/10458306.html

你可能感兴趣的文章
java程序员菜鸟进阶(四)oracle基础详解(四)oracle开启和关闭服务程序——解决安装oracle占用大量内存...
查看>>
Flask_学习笔记_09: Flask中的继承
查看>>
Mahout源码目录说明
查看>>
我的友情链接
查看>>
Java学习日志(17-2-集合框架工具类Arrays及其他特性)
查看>>
HTTP响应头和请求头信息对照表
查看>>
Chrome完美屏蔽优酷广告及黑屏教程
查看>>
一份不错的php面试题(附答案)
查看>>
前端工程资源发布、优化
查看>>
nginx安装(ubuntu14.04)
查看>>
SQLServer2008备份和恢复
查看>>
WinCE 6.0 的编译
查看>>
访问Nginx上的资源时出现403的原因及解决办法
查看>>
大家好,我是蔡某某,刚刚注册的账号,希望大家支持与帮助
查看>>
shell检测输入的IP是否合法
查看>>
30 分钟快速入门 Docker 教程
查看>>
初步计划
查看>>
Ubuntu11.10下编译android源码4.0.3
查看>>
解决安装wordpress出现"此网页包含重定向循环"
查看>>
如何关闭 CentOS7 SELinux
查看>>