BZOJ2631——tree
1、题目大意:bzoj1798的lct版本
2、分析:这个把线段树改成splay就好
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
namespace LinkCutTree{
struct Node{
Node *ch[2], *fa;
LL sum, num;
LL size;
bool rev;
LL mul, plu;
inline int which();
inline void reverse(){
if(this) rev ^= 1;
}
inline void pd();
inline void maintain(){
sum = (num + ch[0] -> sum + ch[1] -> sum) % 51061;
size = (1 + ch[0] -> size + ch[1] -> size) % 51061;
}
Node();
} *null = new Node, tree[100010], *pos[100010];
Node::Node(){
num = sum = 1;
rev = false;
ch[0] = ch[1] = fa = null;
mul = 1;
plu = 0;
size = 1;
}
inline void Node::pd(){
if(rev){
swap(ch[0], ch[1]);
ch[0] -> reverse();
ch[1] -> reverse();
rev = false;
}
if(ch[0] != null){
ch[0] -> mul *= mul;
ch[0] -> plu *= mul;
ch[0] -> plu += plu;
ch[0] -> num *= mul;
ch[0] -> num += plu;
ch[0] -> sum *= mul;
ch[0] -> sum += plu * ch[0] -> size;
ch[0] -> mul %= 51061;
ch[0] -> plu %= 51061;
ch[0] -> num %= 51061;
ch[0] -> sum %= 51061;
}
if(ch[1] != null){
ch[1] -> mul *= mul;
ch[1] -> plu *= mul;
ch[1] -> plu += plu;
ch[1] -> num *= mul;
ch[1] -> num += plu;
ch[1] -> sum *= mul;
ch[1] -> sum += plu * ch[1] -> size;
ch[1] -> mul %= 51061;
ch[1] -> plu %= 51061;
ch[1] -> num %= 51061;
ch[1] -> sum %= 51061;
}
mul = 1;
plu = 0;
}
inline int Node::which(){
if(fa == null || (this != fa -> ch[0] && this != fa -> ch[1])) return -1;
return this == fa -> ch[1];
}
inline void rotate(Node *o){
Node *p = o -> fa;
int l = o -> which(), r = l ^ 1;
o -> fa = p -> fa;
if(p -> which() != -1) p -> fa -> ch[p -> which()] = o;
p -> ch[l] = o -> ch[r];
if(o -> ch[r]) o -> ch[r] -> fa = p;
o -> ch[r] = p; p -> fa = o;
o -> ch[r] -> maintain();
o -> maintain();
}
inline void splay(Node *o){
static stack<Node*> st;
if(!o) return;
Node *p = o;
while(1){
st.push(p);
if(p -> which() == -1) break;
p = p -> fa;
}
while(!st.empty()){
st.top() -> pd(); st.pop();
}
while(o -> which() != -1){
p = o -> fa;
if(p -> which() != -1){
if(p -> which() ^ o -> which()) rotate(o);
else rotate(p);
}
rotate(o);
}
}
inline void Access(Node *o){
Node *y = null;
while(o != null){
splay(o);
o -> ch[1] = y;
o -> maintain();
y = o; o = o -> fa;
}
}
inline void MovetoRoot(Node *o){
Access(o);
splay(o);
o -> reverse();
}
inline Node* FindRoot(Node *o){
Access(o);
splay(o);
while(o -> ch[0] != null) o = o -> ch[0];
return o;
}
inline void Link(Node *x, Node *y){
MovetoRoot(x);
x -> fa = y;
}
inline void Cut(Node *x, Node *y){
MovetoRoot(x);
Access(y);
splay(y);
y -> ch[0] = x -> fa = null;
y -> maintain();
}
}
int main(){
using namespace LinkCutTree;
null -> mul = 1;
null -> size = 0;
null -> plu = 0;
null -> sum = 0;
null -> num = 0;
null -> ch[0] = null -> ch[1] = null -> fa = NULL;
int n, q;
scanf("%d%d", &n, &q);
for(int i = 1; i <= n; i ++) pos[i] = &tree[i];
for(int i = 1; i < n; i ++){
int u, v;
scanf("%d%d", &u, &v);
Link(pos[u], pos[v]);
}
char op[5];
int x1, y1, x2, y2, c;
while(q --){
scanf("%s", op);
if(op[0] == '+'){
scanf("%d%d%d", &x1, &y1, &c);
MovetoRoot(pos[x1]);
Access(pos[y1]);
splay(pos[y1]);
pos[y1] -> num += c;
pos[y1] -> num %= 51061;
pos[y1] -> sum += pos[y1] -> size * c;
pos[y1] -> sum %= 51061;
pos[y1] -> plu += c;
pos[y1] -> plu %= 51061;
}
else if(op[0] == '-'){
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
Cut(pos[x1], pos[y1]);
Link(pos[x2], pos[y2]);
}
else if(op[0] == '*'){
scanf("%d%d%d", &x1, &y1, &c);
MovetoRoot(pos[x1]);
Access(pos[y1]);
splay(pos[y1]);
pos[y1] -> num *= c;
pos[y1] -> num %= 51061;
pos[y1] -> sum *= c;
pos[y1] -> sum %= 51061;
pos[y1] -> mul *= c;
pos[y1] -> mul %= 51061;
pos[y1] -> plu *= c;
pos[y1] -> plu %= 51061;
}
else{
scanf("%d%d", &x1, &y1);
MovetoRoot(pos[x1]);
Access(pos[y1]);
splay(pos[y1]);
pos[y1] -> sum %= 51061;
printf("%lld\n", pos[y1] -> sum);
}
}
return 0;
}
BZOJ2631——tree的更多相关文章
- bzoj2631: tree
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- [BZOJ2631]tree 动态树lct
2631: tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 5171 Solved: 1754[Submit][Status][Discus ...
- [Link-Cut-Tree][BZOJ2631]Tree
题面 Description: 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\(v\)的路径上的点的 ...
- bzoj2631 tree LCT 区间修改,求和
tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 4962 Solved: 1697[Submit][Status][Discuss] Des ...
- bzoj2631: tree lct
要打mul和add的lct 50000+的mod用unsigned int好了TAT (坑爹没打pc('\n');(静态)调了好久,样例竟然只输出一个,orz,也不提示PE T_T) #include ...
- BZOJ2631 tree(伍一鸣) LCT 秘制标记
这个题一看就是裸地LCT嘛,但是我wa了好几遍,这秘制标记...... 注意事项:I.*对+有贡献 II.先下传*再下传+(因为我们已经维护了+,不能再让*对+产生贡献)III.维护+用到size # ...
- [bzoj2631]tree——lct
Brief Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: u v c:将u到v的路径上的点的权值都加上自然数c: u1 v1 u2 ...
- BZOJ2631 tree 【LCT】
题目 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的边( ...
- BZOJ2631: tree(LCT)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...
随机推荐
- lunix的查看Tomcat目录下日志的快速操作
可以使用cd命令,cd命令的功能是切换到指定的目录: 命令格式:cd [目录名] 有几个符号作为目录名有特殊的含义: "/"代表根目录. ".."代表上一级目录 ...
- JS010-DOM
JS010-DOM 本章内容: 1.理解包含不同层次节点的DOM 2.使用不同的节点类型 3.客服浏览器兼容性问题及各种陷阱 DOM(文档对象模型)是针对 HTML和xml文旦过得一个API(应用程序 ...
- javaWeb加载Properties文件
public static Properties loadProps(String fileName) { Properties props = null; InputStream is = null ...
- Spring MVC学习笔记——POJO和DispatcherServlet
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称. 使用POJO名称是为了避免和EJB(Enter ...
- Java——列表框:JList
import java.awt.Container; import java.awt.GridLayout; import java.awt.event.WindowAdapter; import j ...
- c++模板类
c++模板类 理解编译器的编译模板过程 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”.看看我们几乎每天都能遇到的模板类吧,如S ...
- cmake 编译 c++ dll 的一个例子(更新1)
CMakeLists.txt project(xxx) add_library(xxx SHARED xxx.cpp) add_executable(yyy yyy.cpp) target_link_ ...
- php字符串常用算法--字符串加密解密
/** * 加密.解密字符串 * * @global string $db_hash * @global array $pwServer * @param $string 待处理字符串 * @para ...
- MyEclipse 中各种 libraries 的含义
MyEclipse 中各种 libraries 的含义 JRE System Library,Java EE 5 Libraries,Referenced Libraries这三个都是各 ...
- RL中“#” “?” &“”号的作用
阅读目录 1. # 2. ? 3. & 回到顶部 1. # 10年9月,twitter改版.一个显著变化,就是URL加入了"#!"符号.比如,改版前的用户主页网址为http ...