bzoj 2759一个动态树好题
真的是动态树好题,如果把每个点的父亲设成p[x],那么建出来图应该是一个环套树森林,拆掉一条边,就变成了动态树,考虑维护什么,对于LCT上每个节点,维护两组k和b,一组是他到他父亲的,一组是他LCT子树中深度最深的点到深度最浅的点的父亲的k和b,查询时只需查询一颗树中sf到自己的k和b,判断是否有唯一解,然后再解就可以了。注意不能换根,因为树的形态是固定的。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 30005
#define mod 10007
using namespace std;
int n,p[N],q;
int qp(int a,int b){
int c=;
while(b){
if(b&)c=c*a%mod;
a=a*a%mod;b>>=;
}
return c;
}
struct Node{
Node *ch[],*fa,*sf;
int k,b,sumk,sumb,id;
Node();
void pushup();
void pushdown();
}*null=new Node,tree[N];
Node :: Node (){
ch[]=ch[]=fa=sf=null;
k=sumk=;b=sumb=id=;
}
void Node :: pushup(){
sumk=k;sumb=b;
sumb=(sumk*ch[]->sumb%mod+sumb)%mod;sumk=ch[]->sumk*sumk%mod;
sumb=(ch[]->sumk*sumb%mod+ch[]->sumb)%mod;sumk=sumk*ch[]->sumk%mod;
}
void rotate(Node *x){
Node *y=x->fa,*z=y->fa;
int w=y->ch[]==x;
x->ch[w]->fa=y;y->ch[w^]=x->ch[w];
y->fa=x;x->ch[w]=y;
if(z->ch[]==y)z->ch[]=x;
if(z->ch[]==y)z->ch[]=x;
x->fa=z;
y->pushup();x->pushup();
}
bool isroot(Node *x){
return x->fa->ch[]!=x && x->fa->ch[]!=x;
}
void splay(Node *x){
Node *y,*z;
while(!isroot(x)){
y=x->fa;z=y->fa;
if((z->ch[]==y&&y->ch[]==x)||(z->ch[]==y&&y->ch[]==x))
rotate(y);
rotate(x);
}
}
void access(Node *x){
Node *y=null;
while(x!=null){
splay(x);
x->ch[]=y;
x->pushup();
y=x;x=x->fa;
}
}
Node * find(Node *x){
access(x);splay(x);
while(x->ch[]!=null)x=x->ch[];
return x;
}
void cut(Node *x){
Node *rt=find(x);
if(rt==x)x->sf=null;
else{
access(x);
splay(x);
x->ch[]->fa=null;
x->ch[]=null;
x->pushup();
if(find(rt->sf)!=find(rt)){
rt->fa=rt->sf;
rt->sf=null;
}
}
}
void link(Node *x,Node *f,int k,int b){
x->k=k;x->b=b;
if(find(f)==find(x))x->sf=f;
else x->fa=f;
}
int query(Node *x){
Node *rt=find(x),*now=rt->sf;
access(now);splay(now);
if(now->sumk==){
if(now->sumb==)return -;
else return -;
}
int ans=(mod-now->sumb)*qp(((now->sumk-)+mod)%mod,mod-)%mod;
access(x);splay(x);
return (ans*x->sumk%mod+x->sumb)%mod;
}
int main(){
srand();
null->fa=null->ch[]=null->ch[]=null->sf=null;
scanf("%d",&n);
for(int i=,k,b;i<=n;i++){
tree[i].id=i;
scanf("%d%d%d",&k,&p[i],&b);
link(&tree[i],&tree[p[i]],k,b);
}
scanf("%d",&q);
char ch[];
int x,y,z,w;
while(q--){
scanf("%s",ch);
if(ch[]=='A'){
scanf("%d",&x);
printf("%d\n",query(&tree[x]));
}
else{
scanf("%d%d%d%d",&x,&y,&z,&w);
cut(&tree[x]);p[x]=z;
link(&tree[x],&tree[p[x]],y,w);
}
}
return ;
}
bzoj 2759一个动态树好题的更多相关文章
- [BZOJ 2759] 一个动态树好题
[BZOJ 2759] 一个动态树好题 题目描述 首先这是个基环树. 然后根节点一定会连出去一条非树边.通过一个环就可以解除根的答案,然后其他节点的答案就可以由根解出来. 因为要修改\(p_i\),所 ...
- 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 ...
随机推荐
- nifi1.6.0汉化
1.1 测试机 l Apache NiFi 1.6.0 l HDP 2.6.3 l 集群规模:单节点 l 操作系统:CentOs7 l 以下所有操作均在root用户下执行 1.2 安装环境 ...
- form表单提交转为可被 getModel(PROJECT.class ,null);接收
var form = new mini.Form("#editForm"+id); form.validate();if (!form.isValid()) { alert('信息 ...
- 【React入门实例(运行于浏览器duan)】
一.HTML模板 二.ReactDOM.render() ReactDOM.render是React的最基本方法,用于将模板转换为HTML语言,并插入指定的DOM节点. ReactReactDOM.r ...
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...
- win10 下安装mysql服务器社区版本mysql-5.7.22-winx64
下载 下载: http://dev.mysql.com/downloads/mysql/ 解压到C盘 添加环境变量path 添加环境变量 右击我的电脑->属性->高级系统设置->高级 ...
- 移动 Web 的用户界面设计
http://www.ibm.com/developerworks/cn/mobile/wa-interface/index.html 简介 在创新者试图探索新的可能性的同时,新兴技术也在经历快速变化 ...
- 人脸姿态校正算法 附完整C++示例代码
在一些特殊情况下,经常需要依据图像中的人脸,对图片进行倾斜矫正. 例如拍照角度幅度过大之类的情况,而进行人工矫正确实很叫人头大. 那是不是可以有一种算法,可以根据人脸的信息对图片进行角度的修复呢? 答 ...
- [ Java面试题 ] 集合篇
1.ArrayList和Vector的区别 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的 ...
- Beta 冲刺day3
1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:昨天主要是对第三方与企业复杂的逻辑关系进行分析和优化,以及进行部分模块的功能测试和代码测试. 今天解决的进度:根据前天得到的需求问题进行 ...
- flash builder 4.6与myecilpse 10.7集成
一.在flash builder 4.0以后就没有单独提供插件版的flash builder了,因此必须先安装完整版的flash builder,再进行插件集成. 二.集成过程比较简单但也有几个要注意 ...