【国家集训队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
正解:link-cut tree。
毒瘤数据结构题,调了我一下午。。主要是加和乘的lazy标记,下放时如果是乘,那么加的那个标记也要同乘,并且要先下放乘的标记,再下放加的标记。
//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf (1<<30)
#define r64 (51061)
#define N (100010)
#define il inline
#define RG register
#define uint unsigned int
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; uint ch[N][],fa[N],size[N],lazy[N],st[N],rev1[N],rev2[N],val[N],sum[N],n,q;
char s[]; il uint gi(){
RG uint x=,q=; RG char ch=getchar(); while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar(); while (ch>='' && ch<='') x=x*+ch-,ch=getchar(); return q*x;
} il void pushdown(RG uint x){
RG uint &l=ch[x][],&r=ch[x][];
if (lazy[x]) lazy[x]=,lazy[l]^=,lazy[r]^=,swap(l,r);
if (rev2[x]!=){
(val[l]*=rev2[x])%=r64,(val[r]*=rev2[x])%=r64;
(sum[l]*=rev2[x])%=r64,(sum[r]*=rev2[x])%=r64;
(rev1[l]*=rev2[x])%=r64,(rev1[r]*=rev2[x])%=r64;
(rev2[l]*=rev2[x])%=r64,(rev2[r]*=rev2[x])%=r64,rev2[x]=;
}
if (rev1[x]){
(val[l]+=rev1[x])%=r64,(val[r]+=rev1[x])%=r64;
(sum[l]+=rev1[x]*(size[l]%r64))%=r64,(sum[r]+=rev1[x]*(size[r]%r64))%=r64;
(rev1[l]+=rev1[x])%=r64,(rev1[r]+=rev1[x])%=r64,rev1[x]=;
}
return;
} il void pushup(RG uint x){
sum[x]=(sum[ch[x][]]+sum[ch[x][]]+val[x])%r64;
size[x]=size[ch[x][]]+size[ch[x][]]+; return;
} il uint isroot(RG uint x){ return ch[fa[x]][]!=x && ch[fa[x]][]!=x; } il void rotate(RG uint x){
RG uint y=fa[x],z=fa[y],k=ch[y][]==x; if (!isroot(y)) ch[z][ch[z][]==y]=x; fa[x]=z;
ch[y][k^]=ch[x][k],fa[ch[x][k]]=y,ch[x][k]=y,fa[y]=x,pushup(y),pushup(x); return;
} il void splay(RG uint x){
RG uint top=; st[++top]=x;
for (RG uint i=x;!isroot(i);i=fa[i]) st[++top]=fa[i];
while (top) pushdown(st[top--]);
while (!isroot(x)){
RG uint y=fa[x],z=fa[y];
if (!isroot(y)){ if ((ch[z][]==y)^(ch[y][]==x)) rotate(x); else rotate(y); }
rotate(x);
}
return;
} il void access(RG uint x){ RG uint t=; while (x) splay(x),ch[x][]=t,pushup(x),t=x,x=fa[x]; return; } il void split(RG uint x){ access(x),splay(x); return; } il void makeroot(RG uint x){ split(x),lazy[x]^=; return; } il void link(RG uint x,RG uint y){ makeroot(x),fa[x]=y; return; } il void cut(RG uint x,RG uint y){ makeroot(x),split(y),ch[y][]=fa[x]=,pushup(y); return; } il void add(RG uint x,RG uint y,RG uint v){
makeroot(x),split(y),(rev1[y]+=v)%=r64,(val[y]+=v)%=r64,(sum[y]+=v*(size[y]%r64))%=r64; return;
} il void times(RG uint x,RG uint y,RG uint v){
makeroot(x),split(y),(rev1[y]*=v)%=r64,(rev2[y]*=v)%=r64,(val[y]*=v)%=r64,(sum[y]*=v)%=r64; return;
}
il uint query(RG uint x,RG uint y){ makeroot(x),split(y); return sum[y]; } il void work(){
n=gi(),q=gi(); RG uint u,v,c; for (RG uint i=;i<=n;++i) sum[i]=val[i]=rev2[i]=size[i]=;
for (RG uint i=;i<n;++i) u=gi(),v=gi(),link(u,v);
for (RG uint i=;i<=q;++i){
scanf("%s",s); if (s[]=='+') u=gi(),v=gi(),c=gi(),add(u,v,c);
if (s[]=='-') u=gi(),v=gi(),cut(u,v),u=gi(),v=gi(),link(u,v);
if (s[]=='*') u=gi(),v=gi(),c=gi(),times(u,v,c);
if (s[]=='/'){ u=gi(),v=gi(); printf("%u\n",query(u,v)); }
}
return;
} int main(){
File("tree");
work();
return ;
}
【国家集训队2012】tree(伍一鸣)的更多相关文章
- 数据结构(动态树):[国家集训队2012]tree(伍一鸣)
[问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...
- [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(陈立杰)
[国家集训队2012]tree(陈立杰) 题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. INPUT 第一行V,E,need分别表示 ...
- [国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)
tree 时间限制: 3 Sec 内存限制: 512 MB 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入 第一行V, ...
- Tsinsen A1303. tree(伍一鸣) LCT
LCT的各种操作... . cut link add mul size rev query 写的效率不够高... BZOJ上似乎TLE. ... A1303. tree(伍一鸣) 时间限制:2.5s ...
- [国家集训队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 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...
- [国家集训队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 ...
随机推荐
- 学习ASP.NET MVC(十一)——分页
在这一篇文章中,我们将学习如何在MVC页面中实现分页的方法.分页功能是一个非常实用,常用的功能,当数据量过多的时候,必然要使用分页.在今天这篇文章中,我们学习如果在MVC页面中使用PagedList. ...
- (29)网络编程之TCP通信协议
TCP通信协议特点: 1.tcp协议是基于IO流进行数据的传输,是面向链接的. 2.tcp进行数据传输的时候,数据没有大小限制的. 3.面向链接,通过三次握手的机制,保证数据的完整性,是一个可靠的协议 ...
- 【好记性不如烂笔头】死锁之java代码
死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称 ...
- 零件库管理信息系统设计--part03:管理员登录部分设计
兄弟们,我又回来啦! 上次我把表建完了.今天来点干货,我们用ssm框架来先简单实现一下管理员的登录功能. 在实现之前,我对user表(管理员表)做了些简单的修改,先来看看: 忽略哪些蓝色的马赛克和乱输 ...
- 对Golang有兴趣的朋友,推荐一款go语言Web框架-dotweb
Go语言,2009年推出,对我个人,2015年下半年,才下定决心正式开始引入使用Go,自此,让我获得了一种全新的开发体验. 在不断的项目过程中,一个开发人员总喜欢堆积一些代码段,由于Go的开源特性,逐 ...
- 如何下载github项目中的部分文件(文件夹)
https://minhaskamal.github.io/DownGit/#/home 将你要下载的链接放进去即可.
- windows 安装Beautiful Soup(转)
Beautiful Soup是一个Python的一个库,主要为一些短周期项目比如屏幕抓取而设计.有三个特性使得它非常强大: 1.Beautiful Soup提供了一些简单的方法和Python术语,用于 ...
- UT源代码123
(3)设计佣金问题的程序 commission方法是用来计算销售佣金的需求,手机配件的销售商,手机配件有耳机(headphone).手机壳(Mobile phone shell).手机贴膜(Cellp ...
- 序列化与反序列化的单例模式实现和readResolve()
如: public class SingleTest implements Serializable{private static final long serialVersionUID = -860 ...
- 性能调优之访问日志IO性能优化
性能调优之访问日志IO性能优化 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821 ...