[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 ...
随机推荐
- .net使用websocket
专业挖坑21年 1.前 言 网上找了很多资料,可能是自己找的路子不对吧,都找不到适合我这样萌新的文章,大多.net环境使用的websocket都是在说一个通信的案例,学起来的确很吃力,自己也挖 ...
- 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法(第二次修改)
1.线程栈 window的一个进程加载clr.该进程可能含有多个线程,线程创建的时候会分配1MB的栈空间. 如图: void Method() { string name="zhangsan ...
- ubuntu16.4系统和Gentos6.8系统查看开机自启动服务
ubuntu16.4系统查看自启服务: 需要自行安装一个sysv-rc-conf的工具来查看: sudo apt-get install sysv-rc-conf 查看自启命令: sudo sysv- ...
- 解决org.hibernate.HibernateException: identifier of an instance of com.ahd.entity.Order was altered from2 to 0
错误信息 严重: Servlet.service() for servlet [springmvc] in context with path [/order] threw exception [Re ...
- 面试官:你分析过SpringMVC的源码吗?
1. MVC使用 在研究源码之前,先来回顾以下springmvc 是如何配置的,这将能使我们更容易理解源码. 1.1 web.xml <servlet> <servlet-name& ...
- JSP使用过滤器防止SQL注入
什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...
- .Net Mvc 异步编程
关于在mvc/webapi 中 async/await 异步编程的探究和整理 你可以用双手玩转多个球 查看调试器windbg和sos.dll调试器扩展或挖掘W3SVC日志 设置minWorkerThr ...
- 填一个laravel视图缓存没有及时更新的坑
1.此坑背景 laravel在渲染blade模板后,会将渲染好的结果存到storage/framework/views(默认路径,也可在配置中修改的)中,以便下次使用.但我最近总是发现修改了blade ...
- jQuery 练习:tab 切换
实现内容随菜单切换 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- C++代码利用pthread线程池与curl批量下载地图瓦片数据
项目需求编写的程序,稳定性有待进一步测试. 适用场景:在网络地图上,比如天地图与谷歌地图,用户用鼠标在地图上拉一个矩形框,希望下载该矩形框内某一层级的瓦片数据,并将所有瓦片拼接成一个完整的,包含地理坐 ...