[COGS 1799][国家集训队2012]tree(伍一鸣)
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,q
接下来n-1行每行两个正整数u,v,描述这棵树
接下来q行,每行描述一个操作
Output
对于每个/对应的答案输出一行
Sample Input
3 2
1 2
2 3
* 1 3 4
/ 1 1
Sample Output
4
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
题解
比较简单,用来练习 $lct$ 上的 $lazy$ 操作。
//It is made by Awson on 2018.1.16
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
using namespace std;
const int MOD = ;
const int N = 1e5;
void read(int &x) {
char ch; bool flag = ;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || ); ch = getchar());
for (x = ; isdigit(ch); x = (x<<)+(x<<)+ch-, ch = getchar());
x *= -*flag;
}
void write(int x) {
if (x > ) write(x/);
putchar(x%+);
} char ch[];
int n, q, u, v, c;
struct Link_Cut_Tree {
int ch[N+][], pre[N+], rev[N+], sum[N+], prod[N+], val[N+], tol[N+], isrt[N+], size[N+];
Link_Cut_Tree() {for (int i = ; i <= N; i++) val[i] = tol[i] = isrt[i] = prod[i] = size[i] = ; }
void pushup(int o) {tol[o] = (tol[ch[o][]]+tol[ch[o][]]+val[o])%MOD, size[o] = (size[ch[o][]]+size[ch[o][]]+)%MOD; }
void pushdown(int o) {
int ls = ch[o][], rs = ch[o][];
if (rev[o]) {
Swap(ch[ls][], ch[ls][]), Swap(ch[rs][], ch[rs][]);
rev[ls] ^= , rev[rs] ^= , rev[o] = ;
}
if (prod[o] != ) {
prod[ls] = (LL)prod[ls]*prod[o]%MOD, prod[rs] = (LL)prod[rs]*prod[o]%MOD;
sum[ls] = (LL)sum[ls]*prod[o]%MOD, sum[rs] = (LL)sum[rs]*prod[o]%MOD;
val[ls] = (LL)val[ls]*prod[o]%MOD, val[rs] = (LL)val[rs]*prod[o]%MOD;
tol[ls] = (LL)tol[ls]*prod[o]%MOD, tol[rs] = (LL)tol[rs]*prod[o]%MOD;
prod[o] = ;
}
if (sum[o]) {
sum[ls] = (sum[ls]+sum[o])%MOD, sum[rs] = (sum[rs]+sum[o])%MOD;
val[ls] = (val[ls]+sum[o])%MOD, val[rs] = (val[rs]+sum[o])%MOD;
tol[ls] = (tol[ls]+(LL)sum[o]*size[ls]%MOD)%MOD, tol[rs] = (tol[rs]+(LL)sum[o]*size[rs]%MOD)%MOD;
sum[o] = ;
}
}
void push(int o) {
if (!isrt[o]) push(pre[o]);
pushdown(o);
}
void rotate(int o, int kind) {
int p = pre[o];
ch[p][!kind] = ch[o][kind], pre[ch[o][kind]] = p;
if (isrt[p]) isrt[o] = , isrt[p] = ;
else ch[pre[p]][ch[pre[p]][] == p] = o;
pre[o] = pre[p];
ch[o][kind] = p, pre[p] = o;
pushup(p), pushup(o);
}
void splay(int o) {
push(o);
while (!isrt[o]) {
if (isrt[pre[o]]) rotate(o, ch[pre[o]][] == o);
else {
int p = pre[o], kind = ch[pre[p]][] == p;
if (ch[p][kind] == o) rotate(o, !kind), rotate(o, kind);
else rotate(p, kind), rotate(o, kind);
}
}
}
void access(int o) {
int y = ;
while (o) {
splay(o);
isrt[ch[o][]] = , isrt[ch[o][] = y] = ;
pushup(o); o = pre[y = o];
}
}
void makeroot(int o) {access(o), splay(o); rev[o] ^= , Swap(ch[o][], ch[o][]); }
void link(int x, int y) {makeroot(x); pre[x] = y; }
void cut(int x, int y) {makeroot(x), access(y), splay(y); ch[y][] = pre[x] = , isrt[x] = ; pushup(y); }
void split(int x, int y) {makeroot(x), access(y), splay(y); }
void add(int x, int y, int c) {split(x, y); sum[y] = (sum[y]+c)%MOD, val[y] = (val[y]+c)%MOD, tol[y] = (tol[y]+(LL)c*size[y]%MOD)%MOD; }
void plus(int x, int y, int c) {split(x, y); prod[y] = (LL)prod[y]*c%MOD, sum[y] = (LL)sum[y]*c%MOD, val[y] = (LL)val[y]*c%MOD, tol[y] = (LL)tol[y]*c%MOD; }
int query(int x, int y) {split(x, y); return tol[y]; }
}T; void work() {
read(n), read(q);
for (int i = ; i < n; i++) {
read(u), read(v); T.link(u, v);
}
while (q--) {
scanf("%s", ch);
if (ch[] == '+') {read(u), read(v), read(c); T.add(u, v, c); }
else if (ch[] == '-') {
read(u), read(v); T.cut(u, v);
read(u), read(v); T.link(u, v);
}
else if (ch[] == '*') {read(u), read(v), read(c); T.plus(u, v, c); }
else if (ch[] == '/') {read(u), read(v); write(T.query(u, v)), putchar('\n'); }
}
}
int main() {
work();
return ;
}
[COGS 1799][国家集训队2012]tree(伍一鸣)的更多相关文章
- 数据结构(动态树):[国家集训队2012]tree(伍一鸣)
[问题描述] 一棵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(陈立杰)
[国家集训队2012]tree(陈立杰) 题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. INPUT 第一行V,E,need分别表示 ...
- [国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)
tree 时间限制: 3 Sec 内存限制: 512 MB 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入 第一行V, ...
- [国家集训队2012]middle
http://cogs.pro:8080/cogs/problem/problem.php?pid=1763 二分答案x 把区间内>=x的数设为1,<x的数设为-1 左端点在[a,b]之间 ...
- luogu P2619 [国家集训队2]Tree I
题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...
- cogs 1901. [国家集训队2011]数颜色
Cogs 1901. [国家集训队2011]数颜色 ★★★ 输入文件:nt2011_color.in 输出文件:nt2011_color.out 简单对比时间限制:0.6 s 内存限制 ...
- [国家集训队2012]JZPFAR
[国家集训队2012]JZPFAR 题目 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个(或多个)点距离( ...
- P2619 [国家集训队2]Tree I(最小生成树+二分)
P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...
随机推荐
- git常用命令速查
创建 $ git init #在当前目录下创建一个空的本地仓库 $ rm -rf .git #删除本地仓库 $ git add . #把当前目录下的所有文件添加到暂存区 $ git commi ...
- alpha冲刺第七天
一.合照 二.项目燃尽图 三.项目进展 问答界面问答内容呈现 设置里的帐号设置呈现 能爬取教务处网站的内容保存到本地数据库 四.明日规划 继续完善各个内容的界面呈现 查找关于如何自动更新爬取内容 搜索 ...
- C第十八次课
总结知识点: 指针 1.指针变量 指针变量的定义:例8.1 指针变量的引用:例8.2: 指针变量作为函数参数:例8.3 swap函数,例8.4 比较排序函数 2.指针数组 数组元素的指针:int *p ...
- C语言--第二周作业
****学习内容总结**** 1.Git和编辑器截图 2.MOOC截图 3.阅读<提问的智慧>感想 读完<提问的智慧>之后,我认为在提问时,要根据以下步骤: 谨慎明确的描述症状 ...
- 【审核】检查iOS项目中是否使用了IDFA
(1)什么是IDFA 关于IDFA,在提交应用到App Store时,iTunes Connect有如下说明: 这里说到检查项目中是否包含IDFA,那如何来对iOS项目(包括第三方SDK)检查是否包含 ...
- MariaDB/MySQL存储过程和函数
本文目录:1.创建存储过程.函数 1.1 存储过程的IN.OUT和INOUT2.修改和删除存储过程.函数3.查看存储过程.函数信息 在MySQL/MariaDB中,存储过程(stored proced ...
- 织梦dedecms默认网站地图sitemap.html优化
网站地图对于网站优化很重要,搜索引擎就是靠网站地图去收录网站页面,本文主要讲解优化织梦自带的网站地图功能. 织梦自带的网站地图使用方法:织梦后台--生成--HTML更新--更新网站地图,可以在 ...
- SQL SERVER 游标的使用
首先,关于什么是游标大家可以看看这篇文章,介绍得非常详细!! SQL Server基础之游标 下面是我自己的应用场景-- 有个需求,需要把数据库表里面某一个字段的值设为随机不重复的值. 表是这样的: ...
- GIT入门笔记(14)- 链接到远程仓库
1.远程仓库地址https://github.com/ 2.注册远程仓库账号 3.生成ssh-key,并配置到github 由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以, ...
- centos系统升级PHP版本程序
鉴于Centos 默认yum源的php版本太低了,手动编译安装又有点一些麻烦,那么如何采用Yum安装的方案安装最新版呢.那么,今天我们就来学习下如何用yum安装php最新版. 1.检查当前安装的PHP ...