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 ...
随机推荐
- Maximum Subarray(最大子数组)
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- 【JDK1.8】JUC——AbstractQueuedSynchronizer
一.前言 在上一篇中,我们对LockSupport进行了阅读,因为它是实现我们今天要分析的AbstractQueuedSynchronizer(简称AQS)的基础,重新用一下最开始的图: 可以看到,在 ...
- Windows 10创意者更新ISO发布!官方下载
http://news.mydrivers.com/1/526/526719.htm 去年7月份,微软面向Windows 10推出了“周年更新”,让系统变得更加稳定好用.今天,Windows 10迎来 ...
- Java经验杂谈(2.对Java多态的理解)
多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态: 要正确理解多态,我们需要明确如下概念:・定义类型和实际类型・重载和重写・编译和运行 其中实际类型为new关键字后面的类型. 重载发 ...
- JeeSite数据分页与翻页
本文章介绍的是JeeSite开源项目二次开发时的一些笔记,对于没有使用过JeeSite的可以不用往下看了,因为下面的代码是跟JeeSite二次开发相关的代码,不做JeeSite的二次开发,以下代码对您 ...
- 前后台分离部署时,Niginx上的部署
upstream bowenpay_backend { server 127.0.0.1:9002; } server { listen 80; server_name wx.bowenpay.com ...
- 分布式逻辑管理平台XXL-GLUE
<分布式逻辑管理平台XXL-GLUE> 一.简介 1.1 概述 XXL-GLUE 是一个分布式环境下的 "可执行逻辑单元" 管理平台, 学习简单,扩展JVM的动态 ...
- Linux(Redhat)安装Redis
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.(百度百科 0.0) 下载:http://www.redis. ...
- mysql 存储引擎简介
几个常用存储引擎的特点 下面我们重点介绍几种常用的存储引擎并对比各个存储引擎之间的区别和推荐使用方式. 特点 Myisam BDB Memory InnoDB Archive 存储限制 没有 没有 有 ...
- Python--Seaborn绘图和可视化--基本语法
博客地址:http://www.cnblogs.com/yudanqu/ Seaborn是对matplotlib的extend,是一个数据可视化库,提供更高级的API封装,在应用中更加的方便灵活.下面 ...