这个题一看就是裸地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 秘制标记的更多相关文章

  1. Tsinsen A1303. tree(伍一鸣) LCT

    LCT的各种操作... . cut link add mul size rev query 写的效率不够高... BZOJ上似乎TLE. ... A1303. tree(伍一鸣) 时间限制:2.5s  ...

  2. Tsinsen A1303. tree(伍一鸣) (LCT+处理标记)

    [题目链接] http://www.tsinsen.com/A1303 [题意] 给定一棵树,提供树上路径乘/加一个数,加边断边,查询路径和的操作. [思路] LCT+传标 一次dfs构造LCT. L ...

  3. 【国家集训队2012】tree(伍一鸣)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一:  + u v c:将u到v的路径上的点的权值都加上自然数c:  - u1 v1 u2 ...

  4. [COGS 1799][国家集训队2012]tree(伍一鸣)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...

  5. cogs1799 [国家集训队2012]tree(伍一鸣)

    LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...

  6. 数据结构(动态树):[国家集训队2012]tree(伍一鸣)

    [问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...

  7. 秘制牛肉Alpha阶段项目展示

    秘制牛肉Alpha阶段项目展示 1.团队成员和个人博客 · 左顺:"我是左顺,秘制牛肉队开发人员". · 王尖兵:"C,java,html5都会一点的菜鸡,没做过团队项目 ...

  8. 【洛谷1501】[国家集训队] Tree II(LCT维护懒惰标记)

    点此看题面 大致题意: 有一棵初始边权全为\(1\)的树,四种操作:将两点间路径边权都加上一个数,删一条边.加一条新边,将两点间路径边权都加上一个数,询问两点间路径权值和. 序列版 这道题有一个序列版 ...

  9. 秘制牛肉Gamma阶段项目展示

    秘制牛肉Gamma阶段项目展示 1.团队成员和个人博客 · 左顺:在项目中主要负责后端开发.个人博客 · 袁勤:精通网页项目开发,前端后端都很强,在完成自己后端任务后也会积极帮助其他人的任务.个人博客 ...

随机推荐

  1. ERROR: bootstrap checks failed

    错误描述:Linux默认配置的参数过小,需要自己设置 max file descriptors [4096] for elasticsearch process is too low, increas ...

  2. 640. Solve the Equation

    class Solution { public: string solveEquation(string equation) { int idx = equation.find('='); , v1 ...

  3. C语言:类型、运算符、表达式

    看了一天书,有点累了.就写写随笔记录一下今天的复习成果吧. C语言的基本数据类型 数值型:整型数,浮点数,布尔数,复数和虚数. 非数值型:字符. 整数最基本的是int,由此引出许多变式诸如有符号整数s ...

  4. 记一次MD5妙用

    记一次MD5妙用 最近项目组中在做历史记录的改造工作,主持讨论了多次,但每次讨论完都觉的很完美了,但实际在写这部分逻辑的时候还是会发现一些问题出来,很难受,反反复复的暴露智商是硬伤,人艰不拆,暂先不扯 ...

  5. 登録更新(BAPI)

    購買管理(MM) * [BAPI_REQUISITION_CREATE] 購買依頼登録 * [BAPI_REQUISITION_CHANGE] 購買依頼変更 * [BAPI_REQUISITION_D ...

  6. x86的控制寄存器CR0,CR1,CR2,CR3

    状态和控制寄存器组除了EFLAGS.EIP ,还有四个32位的控制寄存器,它们是CR0,CR1,CR2和CR3. 这几个寄存器中保存全局性和任务无关的机器状态. CR0中包含了6个预定义标志,0位是保 ...

  7. Oozie Coordinator job 之定时任务

    使用 Coordinator job 可以执行定时任务和时间触发执行 需要注意的是 Oozie 默认使用的时区与中国时区不是一致的,需要进行一点修改 1.关于时区 a.修改 core-site.xml ...

  8. Java 基础------16进制转2进制

    我们知道,数字8用二进制表示为:1000 用16进制表示为:8 那么我给你一个16进制的数字,0x7f,他的二进制是什么呢? 一个16进制的位数,用4位表示.比如,0x 7 f 其中: 7用4位二进制 ...

  9. 用命令部署WebPart

    Webpart一般是一个wsp文件,可以在VS里面通过右键来部署.但一般真正的生产服务器上面是不会安装VS的,所以一般情况下是把wsp文件拷贝到服务器上面然后启动PowerShell用命令来部署. 部 ...

  10. 【vim环境配置】解决ubuntu上 由YouCompleteMe插件配置不当引起的 自动补全失效的问题

    背景: 由于不可抗拒的原因,学习环境由之前centos的一台机器上,变成了ubuntu的一台机器上.因此,需要在新的ubuntu的机器上再配置一次vim环境.算起来这已经是第三次配置vim环境了(ma ...