[BZOJ 2759] 一个动态树好题

题目描述

首先这是个基环树。

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

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

还是有点难写的。

代码:

#include<bits/stdc++.h>
#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<mod;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
n=Get();
for(int i=1;i<=n;i++) {
k[i]=Get(),p[i]=Get(),b[i]=Get();
update(i);
}
for(int i=1;i<=n;i++) {
if(Find_root(i)!=Find_root(p[i])) Link(i,p[i]);
}
for(int i=1;i<=n;i++) if(i==Find_root(i)) work(i); int m=Get();
char op;
int tim=0;
while(m--) {
while(op=getchar(),!isalpha(op));
int a;
if(op=='A') {
a=Get();
cout<<query(a)<<"\n";
} else {
a=Get();
modify(a);
}
} return 0;
}

[BZOJ 2759] 一个动态树好题的更多相关文章

  1. bzoj 2759一个动态树好题

    真的是动态树好题,如果把每个点的父亲设成p[x],那么建出来图应该是一个环套树森林,拆掉一条边,就变成了动态树,考虑维护什么,对于LCT上每个节点,维护两组k和b,一组是他到他父亲的,一组是他LCT子 ...

  2. BZOJ 2759 一个动态树好题(动态树)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2759 思路 每个节点仅有一条有向出边, 这便是一棵基环内向树,我们可以把它在 \(\text ...

  3. 【刷题】BZOJ 2759 一个动态树好题

    Description 有N个未知数x[1..n]和N个等式组成的同余方程组: x[i]=k[i]*x[p[i]]+b[i] mod 10007 其中,k[i],b[i],x[i]∈[0,10007) ...

  4. BZOJ 2759 一个动态树好题 (LCT)

    PoPoQQQ 再一次orz-没看得特别明白的可以回来看看蒟蒻的补充口胡 我这里提一下关于splaysplaysplay维护的子树信息- 在原树上考虑,对于每一个点iii都有这样一个信息xi=ki∗x ...

  5. BZOJ2759: 一个动态树好题

    BZOJ2759: 一个动态树好题 Description 有N个未知数x[1..n]和N个等式组成的同余方程组:x[i]=k[i]*x[p[i]]+b[i] mod 10007其中,k[i],b[i ...

  6. BZOJ2759 一个动态树好题 LCT

    题解: 的确是动态树好题 首先由于每个点只有一个出边 这个图构成了基环内向树 我们观察那个同余方程组 一旦形成环的话我们就能知道环上点以及能连向环上点的值是多少了 所以我们只需要用一种结构来维护两个不 ...

  7. BZOJ2759一个动态树好题 LCT

    题如其名啊 昨天晚上写了一发忘保存 只好今天又码一遍了 将题目中怕$p[i]$看做$i$的$father$ 可以发现每个联通块都是一个基环树 我们对每个基环删掉环上一条边 就可以得到一个森林了 可以用 ...

  8. 【bzoj2759】一个动态树好题

    Portal -->bzoj2759 Solution 哇我感觉这题真的qwq是很好的一题呀qwq 很神qwq反正我真的是自己想怎么想都想不到就是了qwq 首先先考虑一下简化版的问题应该怎么解决 ...

  9. bzoj 2631: tree 动态树+常数优化

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1716  Solved: 576[Submit][Status] Descrip ...

随机推荐

  1. Android Studio 使用Intent

    1.显式Intent Intent intent=new Intent(yzj.this,MainActivity.class);//当前活动的实例,要去的实例 startActivity(inten ...

  2. [PHP] PHP在CLI环境下的错误日志

    1.display_errors = Off;//控制php是否输出错误;在生产环境中输出会泄露敏感信息;建议记录错误而不是将它们发送到STDOUToff :不显示任何错误;stderr :向STDE ...

  3. 29.C++- 异常处理

    C++内置了异常处理的语法元素 try catch try语句处理正常代码逻辑 当try语句发现异常时,则通过throw语句抛出异常,并退出try语句 catch语句处理异常情况 当throw语句抛出 ...

  4. springMVC_11拦截器实现登录

    一.   思路 controller实现核对用户名和密码,如果核对正确则保存到session中并且跳转到主页 系统中包含诸多界面,部分界面不需要登录即可进行访问,通过拦截器实现判断是否是不需要登录的界 ...

  5. jdk的配置(适用于win7、win8、win10)

    一.前言 win7和win8的jdk配置基本一样,所以本文以win7和win10来说明配置. 二.win7jdk环境配置(win8和这个一样) 首先安装好jdk,这里已安装好jdk7,本文采取的是jd ...

  6. #WEB安全基础 : HTML/CSS | 0x2初识a标签

    教你点厉害玩意,尝尝HTML的厉害! 我为了这节课写了一些东西,你来看看

  7. POJ3734 Blocks(生成函数)

    题意 链接 长度为\(n\)的序列,用红黄蓝绿染色,其中红黄只能是偶数,问方案数 Sol 生成函数入门题 任意的是\(e^x\),偶数的是\(\frac{e^x + e^{-x}}{2}\) 最后化完 ...

  8. 照葫芦画瓢系列之Java --- Maven的介绍和安装

    一.Maven是什么? Maven 是一个项目管理工具.它负责管理项目开发过程中的几乎所有的东西. 版本 maven有自己的版本定义和规则 构建 maven支持许多种的应用程序类型,对于每一种支持的应 ...

  9. iOS---------Xcode中添加预编译pch文件

    第一步:打开项目,com+N,将页面滑动最下面如图 第二步:创建pch文件 第三步:修改buildsetting配置文件       在搜索框里输入prefix搜索一下,比较好找      1.将Pr ...

  10. Testlink1.9.17使用方法(第五章 测试用例管理)

    第五章 测试用例管理 QQ交流群:585499566 TestLink支持的测试用例的管理包含二层:分别为新建测试用例集(Test Suites).创建测试用例(Test Cases).可以把测试用例 ...