BZOJ2631: tree
来源:互联网 发布:网络电视怎么看翡翠台 编辑:程序博客网 时间:2024/05/18 03:42
题目链接
int会炸,long long 会T。。很好。。很好。
注意标记的下传。
【代码】
#include <cstdio>#include <iostream>#include <queue>#include <vector>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#define N 100005 #define M 2001005#define INF 1e9#define mod 51061using namespace std;typedef unsigned int ll;typedef pair<ll,ll> pa;int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x*f;}int n,m,top,cnt;int son[N][2],st[N],fa[N],sz[N];ll sum[N],a[N],inc[N],mul[N];bool rev[N];void Update(int k,int mu,int add){ if(!k) return; a[k]=(a[k]*mu+add)%mod; sum[k]=(sum[k]*mu+add*sz[k])%mod; inc[k]=(inc[k]*mu+add)%mod; mul[k]=(mul[k]*mu)%mod;}void pushup(int p){ sum[p]=(sum[son[p][0]]+sum[son[p][1]]+a[p])%mod; sz[p]=sz[son[p][0]]+sz[son[p][1]]+1;}void pushdown(int k){ int l=son[k][0],r=son[k][1]; if(rev[k]) { rev[k]=0;rev[l]^=1;rev[r]^=1; swap(son[k][0],son[k][1]); } if(mul[k]!=1||inc[k]) Update(l,mul[k],inc[k]),Update(r,mul[k],inc[k]); mul[k]=1,inc[k]=0;}bool isroot(int x){ return son[fa[x]][1]!=x&&son[fa[x]][0]!=x;}void Rotate(int x){ int y=fa[x],z=fa[y],l,r; l=son[y][1]==x;r=l^1; if(!isroot(y)) son[z][son[z][1]==y]=x; fa[x]=z;fa[y]=x;fa[son[x][r]]=y; son[y][l]=son[x][r];son[x][r]=y; pushup(y);pushup(x);}void Splay(int x){ st[++top]=x; for(int i=x;!isroot(i);i=fa[i]) st[++top]=fa[i]; while(top) pushdown(st[top--]); while(!isroot(x)) { int y=fa[x],z=fa[y]; if(!isroot(y)) { if(son[z][0]==y^son[y][0]==x) Rotate(x); else Rotate(y); } Rotate(x); }}void Access(int x){ for(int t=0;x;t=x,x=fa[x]) Splay(x),son[x][1]=t,pushup(x);}void Make_Root(int x){ Access(x);Splay(x);rev[x]^=1;}void Link(int x,int y){ Make_Root(x);fa[x]=y;} void Cut(int x,int y){ Make_Root(x);Access(y);Splay(y); son[y][0]=fa[x]=0;pushup(y);}void split(int x,int y){ Make_Root(x);Access(y);Splay(y);}void Input_Init(){ n=read();m=read(); for(int i=1;i<=n;i++) a[i]=sum[i]=sz[i]=mul[i]=1; for(int i=1;i<n;i++) Link(read(),read());}void Solve_Inc(){ static int x,y,z; x=read(),y=read(),z=read(); split(x,y);Update(y,1,z);}void Solve_Mul(){ static int x,y,z; x=read(),y=read(),z=read(); split(x,y);Update(y,z,0);}void Solve_Refresh(){ static int x,y,xx,yy; x=read(),y=read(),xx=read(),yy=read(); Cut(x,y);Link(xx,yy);}void Solve_Query(){ static int x,y; x=read(),y=read(); split(x,y);printf("%d\n",sum[y]);}void Solve(){ while(m--) { char ch[1]; scanf("%s",ch); if(ch[0]=='+') Solve_Inc(); else if(ch[0]=='-') Solve_Refresh(); else if(ch[0]=='*') Solve_Mul(); else Solve_Query(); }}int main(){ Input_Init(); Solve(); return 0;}
0 0
- bzoj2631 tree
- bzoj2631: tree
- 【BZOJ2631】tree
- bzoj2631 tree
- [BZOJ2631] tree
- [BZOJ2631]tree
- BZOJ2631: tree
- bzoj2631: tree
- Bzoj2631 Tree
- bzoj2631 tree
- BZOJ2631: tree
- 【bzoj2631】tree
- bzoj2631 tree
- 【bzoj2631】tree
- 【BZOJ2631】tree
- bzoj2631: tree
- bzoj2631 tree(伍一鸣)
- bzoj2631: tree LCT
- 一行一步一花新:python-1
- 设计模式之禅
- 二级域名解析使用
- openssl-genras命令简单入门
- openssl的x509命令简单入门
- BZOJ2631: tree
- Retrofit初体验
- ANDROID轻量级JSON序列化和反序列化
- hash 算法
- Learn Emacs in 21 Days: day 3 学习笔记
- toolbar的使用姿势
- OOP面向对象编程
- Ubuntu上安装oh-my-zsh
- 扩展欧几里德算法详解