BZOJ2631 tree(伍一鸣) LCT 秘制标记
这个题一看就是裸地LCT嘛,但是我wa了好几遍,这秘制标记......
注意事项:I.*对+有贡献 II.先下传*再下传+(因为我们已经维护了+,不能再让*对+产生贡献)III.维护+用到size
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 100005
#define P 51061
using namespace std;
inline unsigned int read()
{
unsigned int sum=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
struct LCT
{
struct Node
{
Node *ch[],*f;
unsigned int key,multi,pluss,sum,size;
bool rev;
void pushup()
{
sum=(key+ch[]->sum+ch[]->sum)%P;
size=ch[]->size++ch[]->size;
}
}null[MAXN];
void swap(Node *&x,Node *&y)
{
Node *temp=x;
x=y;
y=temp;
}
void pushdown(Node *p)
{
if(p->rev)
{
p->ch[]->rev^=;
p->ch[]->rev^=;
swap(p->ch[],p->ch[]);
p->rev=;
}
if(p->multi!=)
{
p->ch[]->sum=(p->ch[]->sum*p->multi)%P;
p->ch[]->key=(p->ch[]->key*p->multi)%P;
p->ch[]->pluss=(p->ch[]->pluss*p->multi)%P;
p->ch[]->multi=(p->ch[]->multi*p->multi)%P;
p->ch[]->sum=(p->ch[]->sum*p->multi)%P;
p->ch[]->key=(p->ch[]->key*p->multi)%P;
p->ch[]->pluss=(p->ch[]->pluss*p->multi)%P;
p->ch[]->multi=(p->ch[]->multi*p->multi)%P;
p->multi=;
}
if(p->pluss)
{
if(p->ch[]!=null)
{
p->ch[]->sum=(p->ch[]->sum+p->pluss*p->ch[]->size)%P;
p->ch[]->key=(p->ch[]->key+p->pluss)%P;
p->ch[]->pluss=(p->ch[]->pluss+p->pluss)%P;
}
if(p->ch[]!=null)
{
p->ch[]->sum=(p->ch[]->sum+p->pluss*p->ch[]->size)%P;
p->ch[]->key=(p->ch[]->key+p->pluss)%P;
p->ch[]->pluss=(p->ch[]->pluss+p->pluss)%P;
}
p->pluss=;
}
}
void Init()
{
null->ch[]=null->ch[]=null->f=null;
for(unsigned int i=;i<MAXN;i++)
null[i].ch[]=null[i].ch[]=null[i].f=null,null[i].sum=null[i].key=null[i].multi=,null[i].pluss=;
}
bool isroot(Node *p)
{
return p->f->ch[]!=p&&p->f->ch[]!=p;
}
unsigned int get(Node *p)
{
return p->f->ch[]==p;
}
void rotate(Node *p)
{
Node *fa=p->f,*pa=fa->f;
unsigned int j=get(p);
if(!isroot(fa))pa->ch[get(fa)]=p;
if((fa->ch[j]=p->ch[j^])!=null)fa->ch[j]->f=fa;
fa->f=p;
p->f=pa;
p->ch[j^]=fa;
fa->pushup();
p->pushup();
}
void spaly(Node *p)
{
pushdown(p);
for(Node *fa=p->f;!isroot(p);rotate(p),fa=p->f)
if(!isroot(fa))
{
pushdown(fa->f),pushdown(fa),pushdown(p);
rotate(get(fa)==get(p)?fa:p);
}
else
pushdown(fa),pushdown(p);
}
void expose(Node *x)
{
Node *y=null;
while(x!=null)
{
spaly(x);
x->ch[]=y;
x->pushup();
y=x;
x=x->f;
}
}
void make_root(Node *p)
{
expose(p);
spaly(p);
p->rev^=;
}
void cut(unsigned int a,unsigned int b)
{
Node *x=null+a,*y=null+b;
make_root(x);
expose(y);
spaly(y);
y->ch[]->f=null;
y->ch[]=null;
y->pushup();
}
void link(unsigned int a,unsigned int b)
{
Node *x=null+a,*y=null+b;
make_root(x);
x->f=y;
}
void up(unsigned int a,unsigned int b,unsigned int c)
{
Node *x=null+a,*y=null+b;
make_root(x);
expose(y);
spaly(y);
y->pluss=(y->pluss+c)%P;
y->key=(y->key+c)%P;
y->sum=(y->sum+y->size*c)%P;
}
void UUP(unsigned int a,unsigned int b,unsigned int c)
{
Node *x=null+a,*y=null+b;
make_root(x);
expose(y);
spaly(y);
y->multi=(y->multi*c)%P;
y->key=(y->key*c)%P;
y->sum=(y->sum*c)%P;
y->pluss=(y->pluss*c)%P;
}
unsigned int query(unsigned int a,unsigned int b)
{
Node *x=null+a,*y=null+b;
make_root(x);
expose(y);
spaly(y);
return y->sum;
}
}YY;
int main()
{
YY.Init();
unsigned int n=read(),m=read();
for(unsigned int i=;i<n;i++)
{
unsigned int x=read(),y=read();
YY.link(x,y);
}
for(unsigned int i=,x,y,z,a,b;i<=m;i++)
{
char ch;
cin>>ch;
x=read(),y=read();
switch(ch)
{
case '*':z=read();
YY.UUP(x,y,z);
break;
case '+':z=read();
YY.up(x,y,z);
break;
case '-':a=read(),b=read();
YY.cut(x,y);
YY.link(a,b);
break;
case '/':printf("%d\n",YY.query(x,y));
break;
}
}
return ;
}
BZOJ2631 tree(伍一鸣) LCT 秘制标记的更多相关文章
- Tsinsen A1303. tree(伍一鸣) LCT
LCT的各种操作... . cut link add mul size rev query 写的效率不够高... BZOJ上似乎TLE. ... A1303. tree(伍一鸣) 时间限制:2.5s ...
- Tsinsen A1303. tree(伍一鸣) (LCT+处理标记)
[题目链接] http://www.tsinsen.com/A1303 [题意] 给定一棵树,提供树上路径乘/加一个数,加边断边,查询路径和的操作. [思路] LCT+传标 一次dfs构造LCT. L ...
- 【国家集训队2012】tree(伍一鸣)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 ...
- [COGS 1799][国家集训队2012]tree(伍一鸣)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...
- cogs1799 [国家集训队2012]tree(伍一鸣)
LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...
- 数据结构(动态树):[国家集训队2012]tree(伍一鸣)
[问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...
- 秘制牛肉Alpha阶段项目展示
秘制牛肉Alpha阶段项目展示 1.团队成员和个人博客 · 左顺:"我是左顺,秘制牛肉队开发人员". · 王尖兵:"C,java,html5都会一点的菜鸡,没做过团队项目 ...
- 【洛谷1501】[国家集训队] Tree II(LCT维护懒惰标记)
点此看题面 大致题意: 有一棵初始边权全为\(1\)的树,四种操作:将两点间路径边权都加上一个数,删一条边.加一条新边,将两点间路径边权都加上一个数,询问两点间路径权值和. 序列版 这道题有一个序列版 ...
- 秘制牛肉Gamma阶段项目展示
秘制牛肉Gamma阶段项目展示 1.团队成员和个人博客 · 左顺:在项目中主要负责后端开发.个人博客 · 袁勤:精通网页项目开发,前端后端都很强,在完成自己后端任务后也会积极帮助其他人的任务.个人博客 ...
随机推荐
- pyc是个什么鬼?
1.Python是一门解释型语音? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释型语音,我就这样一直相信下去,知道发现了*.pyc文件的存在.如果是解释型语音,那 ...
- dot安装和使用
1.安装 apt-get install graphviz 如果报错说缺少依赖文件,则使用apt自动安装依赖项 apt-get -f install 我在安装中报错: dpkg: unrecovera ...
- go学习笔记-程序测试
程序测试 测试是一个可重复的过程,它验证某个东西是否按预期工作.一般通过 go test 进行测试,步骤如下 首先,是我们的文件名.Go 要求所有的测试都在以 _test.go 结尾的文件中.这使得我 ...
- java 第五章 方法定义及调用
1.方法的定义 什么是方法 方法是完成某个功能的一组语句,通常将常用的功能写成一个方法 方法的定义 [访问控制符] [修饰符] 返回值类型 方法名( (参数类型 形式参数, ,参数类型 形式参数, , ...
- elasticsearch-mathc和term的区分
elasticsearch和mysql在思想上是有不同的,elasticsearch有分词一说,比如北京奥运分词成北京,奥运,北京奥运.分词要要考虑两点,一个是查询字符串要不要分词,还有就是原存储字段 ...
- Java - 问题集 - linux下,jar: command not found
linux下的找不到jar命令解决方法如下: 1. 确认jdk是否已安装 2. 检查jdk环境变量是否已设置,并且确认该设置已生效 3. 1,2两步均正常时,建立jar的软链接 # cd /usr/b ...
- jmeter插件之jsonpath提取响应结果和做断言
准备工作: 1. jmeter3.X已经自带了提取响应结果的插件:JSON Extractor 2. 下载断言插件:https://jmeter-plugins.org/wiki/JSONPathAs ...
- 基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上)
基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上) 上周BOSS给分配任务让实现一下Mysql数据库的主从复制以及读写分离,然后花了一盏茶的功夫进行了调研,发现主从复制数据库进行一番 ...
- Qt Qpushbutton美化问题
昨天在论坛看到一个网友的提问,如下 我想到的第一个就是可能需要重载Pushbutton,不过看到有网友回复可以使用stykesheet解决,今天尝试了一下,还是没有成功, 一下是我使用车重载的Push ...
- Ubuntu下使用Git_1
这里小小的记录一下我在Ubuntu下使用版本控制工具Git的过程.在学习使用Git的时候,我发现了一个很好的网站,这里分享一下,大家共同学习. 猴子都能懂的Git入门 http://git.wiki. ...