[BZOJ 2631]tree
裸LCT。。QAQ写了三遍没写对
真是老了。。QAQ
主要错的地方是
init:
size[i] = sum[i] = val[i] = mul[i] = 1;
pushdown:
注意判断左右儿子是否为空
splay:
前面有pushdown, stack..
while(!isroot(p)){
int x = fa[p], y = fa[x];
if(!isroot(x))...
}
Access:
while(u){
...
c[u][] = t;
u = fa[u];
}
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #define maxn 100010
- using namespace std;
- typedef long long ll;
- const int md = 51061;
- int n, q;
- int c[maxn][2], fa[maxn], val[maxn], mul[maxn], add[maxn];
- int sum[maxn], top, st[maxn], size[maxn];
- bool rev[maxn];
- namespace splay{
- inline void Mul(int& x, ll y){
- x = x * y % md;
- }
- inline void Add(int& x, ll y){
- x = (x + y) % md;
- }
- void init(){
- for(int i = 1; i <= n; i ++)
- val[i] = mul[i] = 1, add[i] = 0;
- }
- inline void pushup(int x){
- sum[x] = (sum[c[x][0]] + sum[c[x][1]] + val[x]) % md;
- size[x] = size[c[x][0]] + size[c[x][1]] + 1;
- }
- inline void pushdown(int x){
- if(rev[x]){
- if(c[x][0])rev[c[x][0]] ^= 1;
- if(c[x][1])rev[c[x][1]] ^= 1;
- swap(c[x][0], c[x][1]);
- rev[x] = 0;
- }
- int lc = c[x][0], rc = c[x][1];
- if(lc != 0){
- if(mul[x] != 1){
- Mul(mul[lc], mul[x]);
- Mul(add[lc], mul[x]);
- Mul(val[lc], mul[x]);
- Mul(sum[lc], mul[x]);
- }
- if(add[x] != 0){
- Add(add[lc], add[x]);
- Add(val[lc], add[x]);
- Add(sum[lc], (ll)size[lc] * add[x]);
- }
- }
- if(rc != 0){
- if(mul[x] != 1){
- Mul(mul[rc], mul[x]);
- Mul(add[rc], mul[x]);
- Mul(val[rc], mul[x]);
- Mul(sum[rc], mul[x]);
- }
- if(add[x] != 0){
- Add(add[rc], add[x]);
- Add(val[rc], add[x]);
- Add(sum[rc], (ll)size[rc] * add[x]);
- }
- }
- mul[x] = 1, add[x] = 0;
- }
- inline bool isroot(int x){
- return c[fa[x]][0] != x && c[fa[x]][1] != x;
- }
- inline void rotate(int p, int x){
- int mark = p == c[x][1], y = c[p][mark^1], z = fa[x];
- if(c[z][0] == x) c[z][0] = p;
- if(c[z][1] == x) c[z][1] = p;
- if(y) fa[y] = x;
- c[p][mark^1] = x, fa[p] = z;
- c[x][mark] = y, fa[x] = p;
- pushup(x);
- }
- inline void splay(int p){
- st[top = 1] = p;
- for(int i = p; !isroot(i); i = fa[i])
- st[++ top] = fa[i];
- while(top) pushdown(st[top --]);
- while(!isroot(p)){
- int x = fa[p], y = fa[x];
- if(isroot(x))rotate(p, x);
- else if(p == c[x][0] ^ x == c[y][0])
- rotate(p, x), rotate(p, y);
- else rotate(x, y), rotate(p, x);
- }
- pushup(p);
- }
- inline void update(int x, int mu, int ad){
- if(mu != 1){
- Mul(val[x], mu);
- Mul(mul[x], mu);
- Mul(add[x], mu);
- Mul(sum[x], mu);
- }
- if(ad != 0){
- Add(val[x], ad);
- Add(add[x], ad);
- Add(sum[x], (ll)size[x] * ad);
- }
- }
- }
- namespace LCT{
- void Access(int u){
- int t = 0;
- while(u){
- splay::splay(u);
- c[u][1] = t;
- t = u;
- splay::pushup(u);
- u = fa[u];
- }
- }
- void Evert(int u){
- Access(u);
- splay::splay(u);
- rev[u] ^= 1;
- splay::pushdown(u);
- }
- void link(int u, int v){
- Evert(u);
- fa[u] = v;
- //Access(u); splay::splay(u);
- }
- void cut(int u, int v){
- Evert(u);
- Access(v);
- splay::splay(v);
- c[v][0] = fa[u] = 0;
- splay::pushup(v);
- }
- void update(int u, int v, int mu, int ad){
- Evert(u), Access(v);
- splay::splay(v);
- splay::update(v, mu, ad);
- }
- int ask(int u, int v){
- Evert(u), Access(v);
- splay::splay(v);
- return sum[v];
- }
- }
- int main(){
- scanf("%d%d", &n, &q);
- splay::init();
- int u, v, u1, v1, c;
- for(int i = 1; i < n; i ++){
- scanf("%d%d", &u, &v);
- LCT::link(u, v);
- }
- for(int i = 1; i <= q; i ++){
- char ch = getchar();
- for(; ch < '!'; ch = getchar());
- if(ch == '+'){
- scanf("%d%d%d", &u, &v, &c);
- LCT::update(u, v, 1, c);
- }
- if(ch == '-'){
- scanf("%d%d%d%d", &u, &v, &u1, &v1);
- LCT::cut(u, v);
- LCT::link(u1, v1);
- }
- if(ch == '*'){
- scanf("%d%d%d", &u, &v, &c);
- LCT::update(u, v, c, 0);
- }
- if(ch == '/'){
- scanf("%d%d", &u, &v);
- printf("%d\n", LCT::ask(u, v));
- }
- }
- return 0;
- }
[BZOJ 2631]tree的更多相关文章
- bzoj 2631: tree 动态树+常数优化
2631: tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1716 Solved: 576[Submit][Status] Descrip ...
- [BZOJ - 2631] tree 【LCT】
题目链接:BZOJ - 2631 题目分析 LCT,像线段树区间乘,区间加那样打标记. 这道题我调了一下午. 提交之后TLE了,我一直以为是写错了导致了死循环. 于是一直在排查错误.直到.. 直到我看 ...
- BZOJ 2631: tree( LCT )
LCT...略麻烦... -------------------------------------------------------------------------------- #inclu ...
- BZOJ 2631: tree [LCT splay区间]
2631: tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 3854 Solved: 1292[Submit][Status][Discus ...
- BZOJ 2631 tree(动态树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2631 [题目大意] 要求支持链修改,链查询,边断开,连接操作 [题解] 链修改分乘和加 ...
- BZOJ 2631 tree 动态树(Link-Cut-Tree)
题目大意:维护一种树形数据结构.支持下面操作: 1.树上两点之间的点权值+k. 2.删除一条边.添加一条边,保证加边之后还是一棵树. 3.树上两点之间点权值*k. 4.询问树上两点时间点的权值和. 思 ...
- BZOJ 2631 Tree ——Link-Cut Tree
[题目分析] 又一道LCT的题目,LCT只能维护链上的信息. [代码] #include <cstdio> #include <cstring> #include <cs ...
- bzoj 2631: tree link-cut-tree
题目: Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u ...
- 洛谷 1501 [国家集训队]Tree II BZOJ 2631 Tree
[题解] 维护乘法标记和加法标记的LCT #include<cstdio> #include<algorithm> #define Mod (51061) #define N ...
随机推荐
- NYOJ 38布线问题
http://acm.nyist.net/JudgeOnline/problem.php?pid=38 布线问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南阳 ...
- java中四种阶乘的计算
package com.zf.s2;//创建一个包 import java.math.BigInteger;//导入类 import java.util.ArrayList; import jav ...
- 《ASP.NET MVC4 WEB编程》学习笔记------Model模型绑定
本文转载自haiziguo Asp.net mvc中的模型绑定,或许大家经常用,但是具体说他是怎么一回事,可能还是会有些陌生,那么,本文就带你理解模型绑定.为了理解模型绑定,本文会先给出其定义,然后对 ...
- 如何在命令行下运行kettle的作业(job)和转换(transform)
pan 是执行转换的. Pan.bat /file C:\test.ktr /logfile c:\log.txt /level Basic kitchen是执行job的. kitchen.bat / ...
- Java for LeetCode 053 Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [Android Pro] Android签名与认证详细分析之一(CERT.RSA剖析)
转载自:http://www.thinksaas.cn/group/topic/335450/ 一.Android签名概述 我们已经知道的是:Android对每一个Apk文件都会进行签名,在Apk文件 ...
- php 获取当前时间
<?php echo $showtime=date("Y-m-d H:i:s");?>
- OpenStack Swift集群部署流程与简单使用
之前介绍了<OpenStack Swift All In One安装部署流程与简单使用>,那么接下来就说一说Swift集群部署吧. 1. 简介 本文档详细描述了使用两台PC部署一个小型Sw ...
- ServletContext与ServletConfig的详解及区别
转自http://hi.baidu.com/huaxuelili/item/1704a03dbb5cd7f22784f4c6 一.ServletContext详解ServletContext是serv ...
- J2EE面试题集锦(附答案)
转自:http://blog.sina.com.cn/s/blog_4e8be0590100fbb8.html J2EE面试题集锦(附答案)一.基础问答 1.下面哪些类可以被继承? java.lang ...