Tsinsen A1303. tree(伍一鸣) (LCT+处理标记)
【题目链接】
【题意】
给定一棵树,提供树上路径乘/加一个数,加边断边,查询路径和的操作。
【思路】
LCT+传标
一次dfs构造LCT。
LCT维护信息:v,sum,rev,add,mul,siz
提取路径(u,v):evert(u)->Access(v),splay(v),此时以v为根的splay辅助树即u->v的路径,直接进行操作即可。
关于下传标记:
对于一个节点的标记,始终保持该标记已作用在该节点上。
给节点打标记后作用于该节点,每次传标,给儿子打上标记且作用于该儿子。
对于覆盖类标记,直接覆盖即可。反转标记单独处理。
对于非覆盖类标记,考虑操作先后:先下传乘法标记,然后下传加法标记。对于乘法下传,还需要作用在加法标记上。
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#define FOR(a,b,c) for(int a=b;a<=c;a++)
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
using namespace std; typedef long long ll;
typedef unsigned int ul;
const int N = 4e5+;
const int MOD = ; namespace LCT { struct Node {
Node *ch[],*fa;
ul v,siz,rev,add,mul,sum;
Node() ;
//给当前结点打上标记 且更新当前结点
void mulv(int x) {
mul=(mul*x)%MOD;
v=(v*x)%MOD;
add=(add*x)%MOD;
sum=(sum*x)%MOD;
}
void addv(int x) {
v=(v+x)%MOD;
add=(add+x)%MOD;
sum=(sum+siz*x)%MOD;
}
void reverse() {
rev^=;
swap(ch[],ch[]);
}
//up push down
void up_push() {
if(fa->ch[]==this||fa->ch[]==this)
fa->up_push();
if(mul^) { //mul != 1
ch[]->mulv(mul);
ch[]->mulv(mul);
mul=;
}
if(add) {
ch[]->addv(add);
ch[]->addv(add);
add=;
}
if(rev) {
ch[]->reverse();
ch[]->reverse();
rev=;
}
}
void maintain() {
siz=ch[]->siz+ch[]->siz+;
sum=(ch[]->sum+ch[]->sum+v)%MOD;
}
} *null=new Node, T[N];
Node:: Node() {
fa=ch[]=ch[]=null;
add=rev=,mul=siz=;
sum=v=;
} void rot(Node* o,int d) {
Node *p=o->fa;
p->ch[d]=o->ch[d^];
o->ch[d^]->fa=p;
o->ch[d^]=p;
o->fa=p->fa;
if(p==p->fa->ch[])
p->fa->ch[]=o;
else if(p==p->fa->ch[])
p->fa->ch[]=o;
p->fa=o;
p->maintain();
}
void splay(Node* o) {
o->up_push();
Node *nf,*nff;
while(o->fa->ch[]==o||o->fa->ch[]==o) {
nf=o->fa,nff=nf->fa;
if(o==nf->ch[]) {
if(nf==nff->ch[]) rot(nf,);
rot(o,);
} else {
if(nf==nff->ch[]) rot(nf,);
rot(o,);
}
}
o->maintain();
}
void Access(Node* o) {
Node* son=null;
while(o!=null) {
splay(o);
o->ch[]=son;
o->maintain();
son=o; o=o->fa;
}
}
void evert(Node* o) {
Access(o);
splay(o);
o->reverse();
}
void Link(Node *u,Node *v) {
evert(u);
u->fa=v;
}
void Cut(Node *u,Node *v) {
evert(u);
Access(v); splay(v);
u->fa=v->ch[]=null;
v->maintain();
} }
using namespace LCT; struct Edge { int v,nxt;
}e[N<<];
int en=,front[N];
void adde(int u,int v) {
e[++en]=(Edge){v,front[u]}; front[u]=en;
} ll read()
{
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-;
c=getchar();
}
while(isdigit(c))
x=x*+c-'',
c=getchar();
return x*f;
} int n,q; void build(int u,int fa) {
T[u].sum=T[u].v=;
trav(u,i) {
int v=e[i].v;
if(v!=fa) {
T[v].fa=&T[u];
build(v,u);
}
}
} int main()
{
null->siz=null->mul=;
n=read(),q=read();
for(int i=;i<n;i++) {
int u=read(),v=read();
adde(u,v),adde(v,u);
}
build(,-);
char op[];
int u,v,x,y;
while(q--) {
scanf("%s",&op);
u=read(),v=read();
if(op[]=='+' || op[]=='*') {
x=read();
evert(&T[u]);
Access(&T[v]); splay(&T[v]);
if(op[]=='+') T[v].addv(x);
else T[v].mulv(x);
} else
if(op[]=='-') {
x=read(),y=read();
Cut(&T[u],&T[v]);
Link(&T[x],&T[y]);
} else {
evert(&T[u]);
Access(&T[v]); splay(&T[v]);
printf("%d\n",T[v].sum);
}
}
return ;
}
Tsinsen A1303. tree(伍一鸣) (LCT+处理标记)的更多相关文章
- Tsinsen A1303. tree(伍一鸣) LCT
LCT的各种操作... . cut link add mul size rev query 写的效率不够高... BZOJ上似乎TLE. ... A1303. tree(伍一鸣) 时间限制:2.5s ...
- 【国家集训队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:将树中原 ...
- BZOJ2631 tree(伍一鸣) LCT 秘制标记
这个题一看就是裸地LCT嘛,但是我wa了好几遍,这秘制标记...... 注意事项:I.*对+有贡献 II.先下传*再下传+(因为我们已经维护了+,不能再让*对+产生贡献)III.维护+用到size # ...
- HDU 5002 Tree(动态树LCT)(2014 ACM/ICPC Asia Regional Anshan Online)
Problem Description You are given a tree with N nodes which are numbered by integers 1..N. Each node ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- HDU 4718 The LCIS on the Tree (动态树LCT)
The LCIS on the Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
随机推荐
- Pascal编译器大全(非常难得)
http://www.pascaland.org/pascall.htm Some titles (french) : Compilateurs Pascal avec sources = compi ...
- Android:储存方式之SharePreferences
使用SharedPreferences保存数据,其实质是采用了xml文件存放数据, 存储位置:/data/data/<package name>/shared_prefs 写入: publ ...
- [cocoapods]cocoapods问题解决
错误1. While executing gem no such name 错误原因:gem 网址被挡住了. 解决办法:设置https://ruby.taobao.org/ 详情参考 http://w ...
- 剖析MapReduce 作业运行机制
包含四个独立的实体: · Client Node 客户端:编写 MapReduce代码,配置作业,提交MapReduce作业. · JobTracker :初始化作业,分配作业,与 TaskTra ...
- 如何创建支持Eclipse IDE的Maven项目
使用Maven创建的项目是不支持任何IDE的,不能导入IDE中,因为项目格式都不符合特定IDE的格式要求,那么如何创建符合IDE要求的项目呢? 1.使用mvn eclipse:eclipse 命令把项 ...
- 车牌识别LPR系统系列文章汇总
这里的LPR的的几篇文章是之前项目的一些相关资料的整理,涉及实验室内部的资料就没有放上来,希望能对想了解这方面的同学,有所帮助,那怕了解个大概也好.知道整体的思路就好.当初就是一个人瞎摸索,走了很多的 ...
- Main()方法
C#是从方法Main()开始执行的.这个方法必须是类或结构的静态方法,并且其返回类型必须是int或void .虽然显式指定p山屺修饰符是很常见的,因为按照定义,必须在程序外部调用该方法,但我们给该入口 ...
- 在CentOS 6.X 上面安装 Python 2.7.X
在CentOS 6.X 上面安装 Python 2.7.X CentOS 6.X 自带的python版本是 2.6 , 由于工作需要,很多时候需要2.7版本.所以需要进行版本升级.由于一些系统工具和服 ...
- 在BSP的.bat文件下設置全局變量方法
用于多個產品共用一個BSP的時候,在BSP的.bat文件中設置全局變量,去掉不需要加載的驅動和不同點是很好的方法. 一,舉例:BSP中.bat的一段code: set BSP_SMDK2443=1 s ...
- Oracle VM VirtualBox虚拟机安装系统
作为一个前端,必须要有自己的虚拟机,用于测试 IE6 .IE7浏览器. 要测试这两个浏览器,必须要是 Windows XP 系统才可以,这里我找到两个纯净版的 xp 系统 iso 镜像文件. http ...