题解:

lct+解线性方程组

首先先把每一个环搞出来,然后再建立一个额外的点

然后解方程。。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=,M=;
int n,Q,tim,fa[N],dir[N],x,k,p,b,vis[N],ch[N][],ni[N];
char s[];
int which(int x){return ch[fa[x]][]==x;}
struct node
{
int k,b;
node(){}
node(int k,int b):k(k),b(b){}
friend node operator + (const node &r1,const node &r2)
{return node(r1.k*r2.k%M,(r2.k*r1.b%M+r2.b)%M);}
}a[N],sum[N];
void dfs(int x)
{
if (vis[x])return;
vis[x]=tim;
if (vis[fa[x]]==tim)
{
dir[x]=fa[x];
fa[x]=;
}
else dfs(fa[x]);
}
int isroot(int x){return !fa[x]||ch[fa[x]][which(x)]!=x;}
void pushup(int x)
{
sum[x]=a[x];
if (ch[x][])sum[x]=sum[ch[x][]]+a[x];
if (ch[x][])sum[x]=sum[x]+sum[ch[x][]];
}
void rotate(int x)
{
int y=fa[x],k=which(x);
ch[y][k]=ch[x][k^];
ch[x][k^]=y;
if (!isroot(y))ch[fa[y]][which(y)]=x;
fa[x]=fa[y];fa[y]=x;
fa[ch[y][k]]=y;
pushup(y);pushup(x);
}
void splay(int x)
{
for (int y=fa[x];!isroot(x);rotate(x),y=fa[x])
if (!isroot(y))rotate((ch[y][]==x)==(ch[fa[y]][]==y)?y:x);
}
void access(int x)
{
int t=;
while(x)
{
splay(x);
ch[x][]=t;
pushup(x);
t=x;x=fa[x];
}
}
int findroot(int x)
{
access(x);splay(x);
while(ch[x][])x=ch[x][];
splay(x);
return x;
}
int inc(int x,int y)
{
access(dir[y]);splay(dir[y]);
splay(x);
return x==dir[y]||!isroot(dir[y]);
}
void cut(int x){access(x);splay(x);ch[x][]=fa[ch[x][]]=;pushup(x);}
int main()
{
ni[]=;
for (int i=;i<M;i++)ni[i]=(M-M/i)*ni[M%i]%M;
scanf("%d",&n);
for (int i=;i<=n;i++)scanf("%d%d%d",&a[i].k,&fa[i],&a[i].b);
for (int i=;i<=n;i++)
if (!vis[i])tim++,dfs(i);
scanf("%d",&Q);
while (Q--)
{
scanf("%s",s+);
if (s[]=='A')
{
scanf("%d",&x);
access(x);splay(x);
node t1=sum[x];
int t=findroot(x);
access(dir[t]);splay(dir[t]);
node t2=sum[dir[t]];
if (t2.k==)
{
if (t2.b)puts("-1");
else puts("-2");
continue;
}
int v1=ni[(-t2.k+M)%M]*t2.b%M;
printf("%d\n",(t1.k*v1%M+t1.b)%M);
}
else
{
scanf("%d%d%d%d",&x,&k,&p,&b);
access(x);splay(x);
a[x]=node(k,b);pushup(x);
int t=findroot(x);
if (t==x)
{
if (findroot(p)==t)dir[t]=p;
else dir[t]=,fa[t]=p;
}
else
{
if (inc(x,t))
{
cut(x);
access(t);splay(t);
fa[t]=dir[t];dir[t]=;
if (findroot(p)==x)dir[x]=p;
else fa[x]=p;
}
else
{
cut(x);
if (findroot(p)==x)dir[x]=p;
else fa[x]=p;
}
}
}
}
return ;
}

bzoj2759的更多相关文章

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

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

  2. BZOJ2759: 一个动态树好题

    BZOJ2759: 一个动态树好题 Description 有N个未知数x[1..n]和N个等式组成的同余方程组:x[i]=k[i]*x[p[i]]+b[i] mod 10007其中,k[i],b[i ...

  3. BZOJ2759 一个动态树好题 LCT

    题解: 的确是动态树好题 首先由于每个点只有一个出边 这个图构成了基环内向树 我们观察那个同余方程组 一旦形成环的话我们就能知道环上点以及能连向环上点的值是多少了 所以我们只需要用一种结构来维护两个不 ...

  4. BZOJ2759一个动态树好题 LCT

    题如其名啊 昨天晚上写了一发忘保存 只好今天又码一遍了 将题目中怕$p[i]$看做$i$的$father$ 可以发现每个联通块都是一个基环树 我们对每个基环删掉环上一条边 就可以得到一个森林了 可以用 ...

  5. LCT专题练习

    [bzoj2049]洞穴勘测 http://www.cnblogs.com/Sdchr/p/6188628.html 小结 (1)LCT可以方便维护树的连通性,但是图的连通性的维护貌似很麻烦. [bz ...

随机推荐

  1. Windows中杀死某个端口的进程

    最近写项目,总是出现端口被占用的问题,原来傻傻的把电脑重启一下,终于有一天受不了了,想要想办法解决.刚开始从网上找了好多教程,发现不行.开始自己尝试,终于,成功的将占用端口的进程杀掉.在此记录下过程( ...

  2. 【转发】Python使用openpyxl读写excel文件

    Python使用openpyxl读写excel文件 这是一个第三方库,可以处理xlsx格式的Excel文件.pip install openpyxl安装.如果使用Aanconda,应该自带了. 读取E ...

  3. git-【四】撤销修改和删除文件操作

    一:撤销修改: 比如我现在在readme.txt文件里面增加一行 内容为555555555555,我们先通过命令查看如下: 在未提交之前,发现添加5555555555555内容有误,所以得马上恢复以前 ...

  4. Django REST framework 之JWT认证

    Json Web Token 1.JWT简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 H ...

  5. 【转】Deep Learning(深度学习)学习笔记整理系列之(二)

    因为我们要学习的是特征的表达,那么关于特征,或者说关于这个层级特征,我们需要了解地更深入点.所以在说Deep Learning之前,我们有必要再啰嗦下特征(呵呵,实际上是看到那么好的对特征的解释,不放 ...

  6. java map典型排序

    List<Map.Entry<TbDiseases, Double>> list = new ArrayList<Map.Entry<TbDiseases,Doub ...

  7. YTD易出现断层问题,请注意!

    declare @table table( company_id int ,--公司编号 quarter_num ),--季度 disti ),--分销商 num int --数量 ) insert ...

  8. hdu1700 Points on Cycle

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=1700 题目: Points on Cycle Time Limit: 1000/1000 MS ...

  9. linux sar命令详解及使用

    sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用情 ...

  10. 【运维技术】CentOS7上从零开始安装阿里RocketMQ版本:release-4.0.1【亲测哈哈】

    CentOS7上从零开始安装阿里RocketMQ版本:release-4.0.1[亲测哈哈] 安装git # 更新包 $ yum update # 安装git $ yum install git # ...