【bzoj2631】tree link-cut-tree
2016-06-01 08:50:36
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2631
注意加和乘的标记下传问题。
还有就是split后,要分清x和y哪个是祖先。
pushup在access和rotate后都要进行。
这题还卡常数,开ll就会T,开unsigned int即可。
#include<bits/stdc++.h>
#define inf 1000000000
#define uint unsigned int
#define N 100005
#define mod 51061
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,q;
char ch[];
namespace LCT{
int ch[N][],fa[N],sz[N];bool rev[N];
uint cj[N],add[N],val[N],sum[N];
inline bool isroot(int x){
if(ch[fa[x]][]!=x&&ch[fa[x]][]!=x)return ;return ;
}
void change(int x,int c,int a){
if(!x)return;
val[x]=(val[x]*c+a)%mod;
sum[x]=(sum[x]*c+a*sz[x])%mod;
add[x]=(add[x]*c+a)%mod;
cj[x]=(cj[x]*c)%mod;
}
void pushdown(int x){
if(rev[x]){
rev[ch[x][]]^=;rev[ch[x][]]^=;rev[x]^=;
swap(ch[x][],ch[x][]);
}
if(cj[x]!=||add[x]!=){
change(ch[x][],cj[x],add[x]);
change(ch[x][],cj[x],add[x]);
}
cj[x]=;add[x]=;
}
void Pushdown(int x){
if(!isroot(x))Pushdown(fa[x]);
pushdown(x);
}
void pushup(int x){
sum[x]=(sum[ch[x][]]+sum[ch[x][]]+val[x])%mod;
sz[x]=(sz[ch[x][]]+sz[ch[x][]]+)%mod;
}
void rotate(int x){
int y=fa[x],k=ch[y][]==x;
if(!isroot(y))ch[fa[y]][ch[fa[y]][]==y]=x;
fa[x]=fa[y];
fa[ch[x][!k]]=y;
fa[y]=x;
ch[y][k]=ch[x][!k];
ch[x][!k]=y;
pushup(y);pushup(x);
}
void splay(int x){
Pushdown(x);
for(int y=fa[x];!isroot(x);y=fa[x]){
if(!isroot(y)){
if((ch[fa[y]][ch[fa[y]][]==y])!=(ch[y][]==x))rotate(x);
else rotate(y);
}rotate(x);
}
}
inline void access(int x){
int y=;
while(x){
splay(x);
ch[x][]=y;pushup(x);
x=fa[y=x];
}
}
inline void moveroot(int x){
access(x);splay(x);rev[x]^=;
}
inline void link(int x,int y){
moveroot(x);fa[x]=y;splay(x);
}
inline void cut(int x,int y){
moveroot(x);access(y);splay(y);ch[y][]=fa[x]=;
}
inline void split(int x,int y){
moveroot(y);access(x);splay(x);
}
}
int main(){
n=read();q=read();
for(int i=;i<=n;i++)LCT::val[i]=LCT::sum[i]=LCT::cj[i]=LCT::sz[i]=;
for(int i=;i<n;i++)LCT::link(read(),read());
while(q--){
scanf("%s",ch);
int u=read(),v=read();
if(ch[]=='+')LCT::split(u,v),LCT::change(u,,read());
else if(ch[]=='-'){
LCT::cut(u,v);u=read();v=read();LCT::link(u,v);
}
else if(ch[]=='*')LCT::split(u,v),LCT::change(u,read(),);
else LCT::split(u,v),printf("%d\n",LCT::sum[u]%mod);
}
return ;
}
2631: tree
Time Limit: 30 Sec Memory Limit: 128 MB
Submit: 3385 Solved: 1137
[Submit][Status][Discuss]
Description
一棵n个点的树,每个点的初始权值为1。对于这棵树有q个操作,每个操作为以下四种操作之一:
+ u v c:将u到v的路径上的点的权值都加上自然数c;
- u1 v1 u2 v2:将树中原有的边(u1,v1)删除,加入一条新边(u2,v2),保证操作完之后仍然是一棵树;
* u v c:将u到v的路径上的点的权值都乘上自然数c;
/ u v:询问u到v的路径上的点的权值和,求出答案对于51061的余数。
Input
接下来n-1行每行两个正整数u,v,描述这棵树
接下来q行,每行描述一个操作
Output
Sample Input
1 2
2 3
* 1 3 4
/ 1 1
Sample Output
HINT
数据规模和约定
10%的数据保证,1<=n,q<=2000
另外15%的数据保证,1<=n,q<=5*10^4,没有-操作,并且初始树为一条链
另外35%的数据保证,1<=n,q<=5*10^4,没有-操作
100%的数据保证,1<=n,q<=10^5,0<=c<=10^4
【bzoj2631】tree link-cut-tree的更多相关文章
- 【BZOJ 3282】Tree Link Cut Tree模板题
知道了为什么要换根(changeroot),access后为什么有时要splay,以及LCT的其他操作,算是比较全面的啦吧,,, 现在才知道这些,,,真心弱,,, #include<cstdio ...
- 【学习笔记】LCT link cut tree
大概就是供自己复习的吧 1. 细节讲解 安利两篇blog: Menci 非常好的讲解与题单 2.模板 把 $ rev $ 和 $ pushdown $ 的位置记清 #define lc son[x][ ...
- bzoj 3282: Tree (Link Cut Tree)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3282 题面: 3282: Tree Time Limit: 30 Sec Memory L ...
- P3690 【模板】Link Cut Tree (动态树)
P3690 [模板]Link Cut Tree (动态树) 认父不认子的lct 注意:不 要 把 $fa[x]$和$nrt(x)$ 混 在 一 起 ! #include<cstdio> v ...
- LG3690 【模板】Link Cut Tree (动态树)
题意 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的 ...
- AC日记——【模板】Link Cut Tree 洛谷 P3690
[模板]Link Cut Tree 思路: LCT模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 30 ...
- LG3690 【模板】Link Cut Tree 和 SDOI2008 洞穴勘测
UPD:更新了写法. [模板]Link Cut Tree 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 后接两个整数(x,y),代表询问从x到y ...
- (RE) luogu P3690 【模板】Link Cut Tree
二次联通门 : luogu P3690 [模板]Link Cut Tree 莫名RE第8个点....如果有dalao帮忙查错的话万分感激 #include <cstdio> #includ ...
- LuoguP3690 【模板】Link Cut Tree (动态树) LCT模板
P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...
- 【刷题】洛谷 P3690 【模板】Link Cut Tree (动态树)
题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...
随机推荐
- [Outlook] 重新取得outlook中被禁止访问的文件
摘要:接收到老大的邮件,邮件中带有jar包,导致我无法接收到这个文件,outlook2010中提示:outlook禁止访问不安全……,相信很多人都遇到过这个问题,以前也遇到过,总没去想着解决这个问题, ...
- zzy:请求静态资源和请求动态资源, src再次请求服务器资源
[总结可以发起请求的阶段:请求动态资源:通过web.xml匹配action然后,自定义Servlet处理该action1)form表单提交请求的时候,用action设定,该页面发起请求的Servlet ...
- 第十三篇:在SOUI中使用有窗口句柄的子窗口
前言: 无论一个DirectUI系统提供的DUI控件多么丰富,总会有些情况下用户需要在DUI窗口上放置有窗口句柄的子窗口. 为了和无窗口句柄的子窗口相区别,这里将有窗口句柄的子窗口称之为真窗口. 每一 ...
- barabasilab-networkScience学习笔记6-evolving networks
第一次接触复杂性科学是在一本叫think complexity的书上,Allen博士很好的讲述了数据结构与复杂性科学,barabasi是一个知名的复杂性网络科学家,barabasilab则是他所主导的 ...
- TCP拆包粘包之分隔符解码器
TCP以流的方式进行数据传输,上层的应用协议为了对消息进行区分,往往采用如下4种方式. (1)消息长度固定,累计读取到长度总和为定长LEN的报文后,就认为读取到了一个完整的消息:将计数器置位,重新开始 ...
- (转)ACM next_permutation函数
转自 stven_king的博客 这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>下面是以前的笔记 (1) int 类型的next_permuta ...
- DSP using MATLAB示例Example3.16
代码: b = [0.0181, 0.0543, 0.0543, 0.0181]; % filter coefficient array b a = [1.0000, -1.7600, 1.1829, ...
- [工作bug]c:import参数传递问题解析
一.起因: 在项目的工厂中,由于某个界面根据产品种类显示的产品属性均不相同,所以决定将界面进行拆分,将每一个产品写入一个jsp界面,分别命名为product0.jsp.product1.jsp,在主界 ...
- idea 使用
1.idea对maven的兼容性优于eclipse,idea对于程序内部管理是模块,个人感觉也是优于eclipse. 2.idea默认设置编辑器字体是比较差的. 可以参考文章 http://www.3 ...
- Java类与对象的基础学习
1. 请输入并运行以下代码,得到什么结果? public class Test{ public static void main(String args[]){ Foo obj1=new Foo(); ...