[BZOJ 2759] 一个动态树好题
[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] 一个动态树好题的更多相关文章
- bzoj 2759一个动态树好题
真的是动态树好题,如果把每个点的父亲设成p[x],那么建出来图应该是一个环套树森林,拆掉一条边,就变成了动态树,考虑维护什么,对于LCT上每个节点,维护两组k和b,一组是他到他父亲的,一组是他LCT子 ...
- BZOJ 2759 一个动态树好题(动态树)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2759 思路 每个节点仅有一条有向出边, 这便是一棵基环内向树,我们可以把它在 \(\text ...
- 【刷题】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) ...
- BZOJ 2759 一个动态树好题 (LCT)
PoPoQQQ 再一次orz-没看得特别明白的可以回来看看蒟蒻的补充口胡 我这里提一下关于splaysplaysplay维护的子树信息- 在原树上考虑,对于每一个点iii都有这样一个信息xi=ki∗x ...
- BZOJ2759: 一个动态树好题
BZOJ2759: 一个动态树好题 Description 有N个未知数x[1..n]和N个等式组成的同余方程组:x[i]=k[i]*x[p[i]]+b[i] mod 10007其中,k[i],b[i ...
- BZOJ2759 一个动态树好题 LCT
题解: 的确是动态树好题 首先由于每个点只有一个出边 这个图构成了基环内向树 我们观察那个同余方程组 一旦形成环的话我们就能知道环上点以及能连向环上点的值是多少了 所以我们只需要用一种结构来维护两个不 ...
- BZOJ2759一个动态树好题 LCT
题如其名啊 昨天晚上写了一发忘保存 只好今天又码一遍了 将题目中怕$p[i]$看做$i$的$father$ 可以发现每个联通块都是一个基环树 我们对每个基环删掉环上一条边 就可以得到一个森林了 可以用 ...
- 【bzoj2759】一个动态树好题
Portal -->bzoj2759 Solution 哇我感觉这题真的qwq是很好的一题呀qwq 很神qwq反正我真的是自己想怎么想都想不到就是了qwq 首先先考虑一下简化版的问题应该怎么解决 ...
- bzoj 2631: tree 动态树+常数优化
2631: tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1716 Solved: 576[Submit][Status] Descrip ...
随机推荐
- Redirect all output to file
That part is written to stderr, use 2> to redirect it. For example: foo > stdout.txt 2> std ...
- JQuery禁止/恢复按钮readonly和disabled小结
禁止/恢复按钮 其实就是更改 <input> 的属性. 禁用 id 为 btn 的按钮: 代码如下 复制代码 $("#btn").attr({"disabl ...
- jQuery插件之上传文件ajaxfileupload.js源码与使用
在网页应用中,一般会用到上传文件或者图片什么的到服务器,那么可以用ajaxfileupload.js,但是在使用ajaxfileupload.js时候,当服务器返回的json带有&符号的时候, ...
- [转]原生JS-查找相邻的元素-siblings方法的实现
在针对element的操作里,查找附近的元素是一个不可少的过程,比如在实现tab时,其中的一个div增加了“on”class,其他的去除“on”class.如果用jquery的朋友就肯定不会陌生sib ...
- Ehcache配置详解及CacheManager使用
<?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi="http://w ...
- SD Consultant Year End Activities
SD Consultant Year End Activities What are the year ending activities to be done for SAP SD? S.No ...
- 如何用ABP框架快速完成项目(7) - 用ABP一个人快速完成项目(3) - 通过微服务模式而不是盖楼式来避免难度升级和奥卡姆剃刀原理
这节文章十分重要!十分重要!十分重要! 很多同学在使用ABP的过程中遇到很多问题, 花费了很多时间和精力都还无法解决, 就是卡在这节文章这里. Talk is cheap, just show ...
- 聊天ListView
我们知道,在微信或者QQ聊天的时候,会出现至少两种布局,即收到的消息和自己发送的消息,这种效果可以用listView来实现.类似于下面这样的界面. 主要在Adapter的getView()里面下笔. ...
- 算法: 包含min函数的栈
* @Description 包含min函数的栈* @问题:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).* @思路: 1:Stack 类中的p ...
- (网页)JavaScript周末总结(一)
本周学习的内容总结: 1. 2章在html中使用javascript. 2. 3章Javascript的基本概念. 3. 4章变量,作用域,内存问题. 1-1:2章以下内容: 1.包含javascri ...