题目

有\(N\)个未知数\(x[1..n]\)和\(N\)个等式组成的同余方程组:
\(x[i]=k[i]*x[p[i]]+b[i] mod 10007\)
其中,\(k[i],b[i],x[i]∈[0,10007)∩Z\)
你要应付\(Q\)个事务,每个是两种情况之一:
一.询问当前\(x[a]\)的解
\(A\ a\)
无解输出-1
\(x[a]\)有多解输出-2
否则输出\(x[a]\)
二.修改一个等式
\(C\ a\ k[a]\ p[a]\ b[a]\)

思路1

此题一直有点迷,在paulliant大佬的指点下,勉强口胡一份题解。

首先不难发现,这是一个树形结构,每个点仅有一条有向出边,知道了每个点的父亲就能知道这个点,所以这是一棵基环树,然后我们用一个结构体表示当前点与它父亲的依赖关系。\((K,B)\)表示\(x=fa[x]*K+B\)

由于是单向边的有根树,所以每条边都指向它的父亲。所以对于LCT中的一条路径\((u,v)\)来说,\(sum[rt]=(node){K,B}\)表示\(u=Kv+B\),合并什么的还是很好推的。

还有一题小R与手机和此题有几分相像。

struct node{int k,b;node operator + (const node& res)const{return (node){k*res.k%P,(res.k*b%P+res.b)%P};}
}

然后如果存在了环的话,可以先把它存下来,等之后有点被删掉了之后在加上去。之后询问的时候由于形成了环,所以就可以得到解的情况了。

代码

#include<bits/stdc++.h>
#define M 100005
using namespace std;
const int P=1e4+7;
int inv[M],Ifa[M];
int n;
struct node{int k,b;node operator + (const node& res)const{return (node){k*res.k%P,(res.k*b%P+res.b)%P};}
}val[M],sum[M];
struct LCT{int ch[M][2],fa[M];void up(int p){sum[p]=sum[ch[p][0]]+val[p]+sum[ch[p][1]];}void create(int x,node d){ch[x][0]=ch[x][1]=fa[x]=0;val[x]=sum[x]=d;}bool isrt(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}void rotate(int x){int y=fa[x],z=fa[y],k=ch[y][1]==x;if(!isrt(y))ch[z][ch[z][1]==y]=x;fa[x]=z;ch[y][k]=ch[x][!k];fa[ch[x][!k]]=y;ch[x][!k]=y;fa[y]=x;up(y);up(x);}void splay(int x){while(!isrt(x)){int y=fa[x],z=fa[y];if(!isrt(y))(ch[y][1]==x^ch[z][1]==y)?rotate(x):rotate(y);rotate(x);}}void access(int x){for(int y=0;x;y=x,x=fa[x])splay(x),ch[x][1]=y,up(x);}int findrt(int x){access(x);splay(x);while(ch[x][0])x=ch[x][0];splay(x);return x;}bool link(int x,int y){splay(x);if(findrt(y)==x)return 0;fa[x]=y;return 1;}bool cut(int x){access(x),splay(x);if(!ch[x][0])return 0;fa[ch[x][0]]=0;ch[x][0]=0;up(x);return 1;}void update(int x,node d){val[x]=sum[x]=d;up(x);splay(x);}node query(int x){access(x),splay(x);return sum[x];}void Link(int x,int y){if(!link(x,y))Ifa[x]=y;}void Cut(int x){int y=findrt(x);if(!cut(x)){Ifa[x]=0;return;}if(link(y,Ifa[y]))Ifa[y]=0;}int solve(int x){int y=findrt(x),z=Ifa[y];node f=query(z);if(f.k==1)return f.b==0?-2:-1;int vl=f.b*inv[(P+1-f.k)%P]%P;f=query(x);return (f.k*vl+f.b)%P;}
}Tr;
int main(){inv[0]=inv[1]=1;for(int i=2;i<=P-1;i++)inv[i]=(P-P/i)*inv[P%i]%P;scanf("%d",&n);for(int i=0;i<=n;i++)Tr.create(i,(node){1,0});for(int i=1;i<=n;i++){int k,p,b;scanf("%d%d%d",&k,&p,&b);Tr.update(i,(node){k,b});Tr.Link(i,p);}int q;scanf("%d",&q);while(q--){char op[5];int a,k,p,b;scanf("%s",op);if(op[0]=='A'){scanf("%d",&a);printf("%d\n",Tr.solve(a));}else {scanf("%d%d%d%d",&a,&k,&p,&b);Tr.update(a,(node){k,b});Tr.Cut(a);Tr.Link(a,p);}}return 0;
}

  1. [BZOJ 2759 一个动态树好题(动态树)]↩

转载于:https://www.cnblogs.com/zryabc/p/10701390.html

BZOJ2759 一个动态树好题相关推荐

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

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

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

    滚回来学文化课了-- 题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2759 题解 LCT,显然的做法是维护链上所有一次函数的复合. 如何 ...

  3. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大

    题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax​为yyy 解题思路: 首先我们知道权值线段树是 ...

  4. luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

    题目背景 动态树 题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...

  5. 【BZOJ4372】烁烁的游戏 动态树分治+线段树

    [BZOJ4372]烁烁的游戏 Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠. 题意: 给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠. 烁烁他每次会跳到一个节点u,把周围 ...

  6. 如何利用FineReport制作动态树报表

    在对数据字段进行分类管理时,利用动态树折叠数据是一个很好的方法,也就是点击数据前面的加号才展开对应下面的数据,如下图.那这样的效果在制作报表时该如何实现呢? 下面以报表工具FineReport为例介绍 ...

  7. 【动态树】[BZOJ2002] Bounce 弹飞绵羊

    实际上就是动态树的模版加上一个维护每一条链的size这样就可以吧一次弹射看成一条路径,然后统计这个路径上的size实际上就是经过了多少个节点然后没什么了.. #include <bits/std ...

  8. hdu1305 字典树水题

    题意:      给你一些字符串,然后问你他们中有没有一个串是另一个串的前缀. 思路:       字典树水题,(这种水题如果数据不大(这个题目不知道大不大,题目没说估计不大),hash下也行,把每个 ...

  9. P4719 【模板】“动态 DP“动态树分治(矩阵/轻重链剖分/ddp)

    P4719 [模板]"动态 DP"&动态树分治 求解树上最大权独立集,但是需要支持修改. https://www.luogu.com.cn/problem/solution ...

最新文章

  1. Docker----在Docker中部署Asp.net core2.1以及修改发布
  2. 基于深度学习网络的运动想象BCI系统及其应用
  3. 2020-12-28 Matlab自动化控制-Adrc自抗扰控制
  4. SAP中PDF文件本地保存方法
  5. matlab var std,Matlab var std cov 函数解析
  6. AjaxControlToolkit AjaxFileUpload 为英文的解决办法
  7. thinkphp 请求
  8. 关于设置table样式后,不停点击按钮table中的数据会逐渐被最后一行替换的问题...
  9. 使用SQL Storage Compress压缩SQL Server 数据库文件
  10. Vue_(组件)计算属性
  11. 嗅探辅助利器-幻影网盾原理
  12. 模拟器游戏修改之教你如何修改gba rom里的程序!
  13. 龙芯2f平台下 Debain 6编译Lighttpd
  14. Android上层进入recovery流程
  15. 基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程
  16. C++ 对txt文档进行编辑
  17. java毕业生设计新疆旅游专列订票系统计算机源码+系统+mysql+调试部署+lw
  18. Firebase token认证 “kid“ invalid, unable to lookup correct key
  19. 关于scene understanding场景理解概念的理解
  20. 【图解HTTP】确保WEB安全的HTTPS

热门文章

  1. Arturia Prophet Mac音频插件:将Prophet 5,Prophet VS,Prophet Hybrid三种不同音乐合成器于一体
  2. python后台返回cookie_Django框架设置cookies与获取cookies操作详解
  3. 正确的python变量名_在Python,如何将变量名作为字符串?_others_酷徒编程知识库...
  4. Vue第一部分(6):Vue的生命周期
  5. Linux基础学习三:VMware和CentOS的安装详细图文教程
  6. [2] ADB 基本用法
  7. C++工作笔记-对'xxxxx'未定义的引用的2种情况
  8. Python笔记-使用sqlalchemy根据类创建数据库表
  9. Redis工作笔记-List类型
  10. C++远程dll注入到QQ聊天工具