bzoj2759
题解:
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的更多相关文章
- 【bzoj2759】一个动态树好题
Portal -->bzoj2759 Solution 哇我感觉这题真的qwq是很好的一题呀qwq 很神qwq反正我真的是自己想怎么想都想不到就是了qwq 首先先考虑一下简化版的问题应该怎么解决 ...
- 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$ 可以发现每个联通块都是一个基环树 我们对每个基环删掉环上一条边 就可以得到一个森林了 可以用 ...
- LCT专题练习
[bzoj2049]洞穴勘测 http://www.cnblogs.com/Sdchr/p/6188628.html 小结 (1)LCT可以方便维护树的连通性,但是图的连通性的维护貌似很麻烦. [bz ...
随机推荐
- mysql实现开窗函数、Mysql实现分析函数
关键字:mysql实现开窗函数.Mysql实现分析函数.利用变量实现窗口函数 注意,变量是从左到右顺序执行的 --测试数据 CREATE TABLE `tem` ( `id` ) NOT NULL A ...
- .NET、NET Framewor以及.NET Core的关系(二)
什么是CLR,.NET虚拟机? 实际上,.NET不仅提供了自动内存管理的支持,他还提供了一些列的如类型安全.应用程序域.异常机制等支持,这些 都被统称为CLR公共语言运行库. CLR是.NET类型系统 ...
- EasyUI Draggable 可拖动
通过 $.fn.draggable.defaults 重写默认的 defaults. 用法 通过标记创建可拖动(draggable)元素. <div id="dd" clas ...
- (转)利用Spring AOP自定义注解解决日志和签名校验
一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...
- 转: C# 根据当前时间获取,本周,本月,本季度等时间段 .Net中Exception
DateTime dt = DateTime.Now; //当前时间 DateTime startWeek = dt.AddDays( - Convert.ToInt32(dt.DayOfWeek.T ...
- 89. Gray Code(公式题)
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
- 算法第四版 在Linux 中调用Algs4库
一: 搭建Java 环境 : 确认版本: 1.8及以上 [username:~/] javac -version javac 1.8.0_111 [username:~/] java -versi ...
- VS2010/MFC编程入门之前言
鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了.但是教程中讲的例子只是一个个简单的例程,并没有可视化窗口.鸡啄米在这套VS2010/M ...
- ng-深度学习-课程笔记-10: 机器学习策略2(Week2)
1 误差分析( Carrying out error analysis ) 假设你训练了一个猫的二分类模型,在开发集上的错误率是10%,你想分析这10%的错误率来自哪里,怎么做呢? 先把这些错分的图片 ...
- SQL 处理排序空值
①oracle默认排序空值在后面 如果想要排序空值在前面可用关键字 NULLS FIRST, 排序空值在后面也有关键字NULLS LAST ②sqlserver默认排序空值在前面 如果想要排序时空值在 ...