BZOJ 2631 Tree ——Link-Cut Tree
【题目分析】
又一道LCT的题目,LCT只能维护链上的信息。
【代码】
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 1000005
#define inf (0x3f3f3f3f)
#define mod 51061
unsigned int read()
{
unsigned int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
unsigned int ch[maxn][2],fa[maxn],add[maxn],mul[maxn],num[maxn],sum[maxn];
unsigned int n,m,siz[maxn],rev[maxn],sta[maxn],top=0;
void update(unsigned int x)
{
siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
sum[x]=(sum[ch[x][0]]+sum[ch[x][1]]+num[x])%mod;
}
void solve(unsigned int x,unsigned int ad,unsigned int ml)
{
if (!x) return ;
add[x]=(add[x]*ml+ad)%mod; mul[x]=(mul[x]*ml)%mod;
sum[x]=(sum[x]*ml+siz[x]*ad)%mod; num[x]=(num[x]*ml+ad)%mod;
}
void pushdown(unsigned int x)
{
if (rev[x])
{
rev[x]^=1;
rev[ch[x][0]]^=1;
rev[ch[x][1]]^=1;
swap(ch[x][0],ch[x][1]);
}
solve(ch[x][0],add[x],mul[x]);
solve(ch[x][1],add[x],mul[x]);
mul[x]=1; add[x]=0;
}
bool isroot(unsigned int x)
{
return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
}
void rot(unsigned int x)
{
unsigned int y=fa[x],z=fa[y],l,r;
if (ch[y][0]==x) l=0; else l=1;
r=l^1;
if (!isroot(y))
{
if (ch[z][0]==y) ch[z][0]=x;
else ch[z][1]=x;
}
fa[x]=z; fa[y]=x; fa[ch[x][r]]=y;
ch[y][l]=ch[x][r]; ch[x][r]=y;
update(y); update(x);
}
void splay(unsigned int x)
{
unsigned int top=0; sta[top++]=x;
for (int i=x;!isroot(i);i=fa[i]) sta[top++]=fa[i];
while (top--) pushdown(sta[top]);
while (!isroot(x))
{
unsigned int y=fa[x],z=fa[y];
if (!isroot(y))
{
if (ch[z][0]==y^ch[y][0]==x) rot(x);
else rot(y);
}
rot(x);
}
}
void access(unsigned int x)
{
for (int t=0;x;t=x,x=fa[x])
splay(x),ch[x][1]=t,update(x);
}
void makeroot(unsigned int x)
{
access(x);
splay(x);
rev[x]^=1;
}
unsigned int find(unsigned int x)
{
access(x);
splay(x);
while (ch[x][0]) x=ch[x][0];
return x;
}
void link(unsigned int x,unsigned int y)
{
makeroot(x);
fa[x]=y;
}
void cut(unsigned int x,unsigned int y)
{
makeroot(x);
access(y);
splay(y);
ch[y][0]=fa[x]=0;
}
int main()
{
n=read();m=read();
for (unsigned int i=1;i<=n;++i) num[i]=1,update(i);
char opt[10];
for (unsigned int i=1;i<n;++i) link(read(),read());
while (m--)
{
scanf("%s",opt);
unsigned int x,y,z;
switch (opt[0])
{
case '+':
x=read(); y=read(); z=read();
makeroot(x);
access(y);
splay(y);
solve(y,z,1);
break;
case '-':
cut(read(),read()); link(read(),read());
break;
case '*':
x=read();y=read();z=read();
makeroot(x);
access(y);
splay(y);
solve(y,0,z);
break;
case '/':
x=read();y=read();
makeroot(x);
access(y);
splay(y);
printf("%u\n",sum[y]);
break;
}
}
}
BZOJ 2631 Tree ——Link-Cut Tree的更多相关文章
- bzoj 3282: Tree (Link Cut Tree)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3282 题面: 3282: Tree Time Limit: 30 Sec Memory L ...
- 【BZOJ 3282】Tree Link Cut Tree模板题
知道了为什么要换根(changeroot),access后为什么有时要splay,以及LCT的其他操作,算是比较全面的啦吧,,, 现在才知道这些,,,真心弱,,, #include<cstdio ...
- [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree)
[BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree) 题面 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一 ...
- link cut tree 入门
鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. ...
- Link Cut Tree学习笔记
从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...
- Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...
- Link/cut Tree
Link/cut Tree 一棵link/cut tree是一种用以表示一个森林,一个有根树集合的数据结构.它提供以下操作: 向森林中加入一棵只有一个点的树. 将一个点及其子树从其所在的树上断开. 将 ...
- 洛谷P3690 Link Cut Tree (模板)
Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门
link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...
随机推荐
- IIS 4.0配置
neHandler” 今天安装了windows7 开发web项目需要安装IIS,当安装完以后,web程序已经映射到了本地IIS上,运行出现如下错误提示 处理程序“PageHandlerFactor ...
- iOS runtime 的经典作用
- .NET微信公众号开发-4.0公众号消息处理
一.前言 微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文消息,到图片消息,语音消息,视频消息,音乐消息其基本原理都是一样的,只不过所post的xml数据有所差别,在处理消息之前,我们 ...
- apache vhost
httpd.conf: Include "F:/wamp/alias/*" <Directory "F:\wamp\www"> Options ...
- [Android ] linux命令英文缩写的含义(方便记忆)
du -sh */ reference to : http://blog.chinaunix.net/uid-27164517-id-3299073.html linux常用命令的英文单词缩写 命令缩 ...
- error C2664: 'TextOutW' : cannot convert parameter 4 from const char [5]' to LPCTSTR
转自:http://blog.sina.com.cn/s/blog_4aa4593d0100odra.html 问题的原因是字符串ANSI和Unicode编码的区别, VC6与VS2003等默认使用A ...
- timestamp 类型的索引
由这条语句datetime.strftime('2014/12/05','%Y/%m/%d')转换出来的索引 是pandas内置类型相同,如果使用datetime.strftime('2014/12/ ...
- Android高性能ORM数据库DBFlow入门
DBFlow,综合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等库的优点.同时不是基于反射,所以性能也是非常高,效率紧跟greenDAO其后.基于注解,使用 ...
- elk深度解析
上面的两张图是elk的一个架构 下面是对logstash分析:如下图 可以看出 logstash的一个角色shipper,(是通过配置文件来决定logstash是shipper还是indexer)注意 ...
- gitlab 用户头像不能显示的问题
[root@GitLab assets]# cat /etc/gitlab/gitlab.rb # Change the external_url to the address your users ...