LCT裸题

注意打标记之间的影响就是了

这个膜数不会爆unsigned int

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cctype>
using namespace std;
#define rg register
#define il inline
#define sta static
#define vd void
#define int unsigned int
#define mod 51061
il int gi(){sta int x,flg;sta char ch;x=flg=0,ch=getchar();while(!isdigit(ch)){if(ch=='-')flg=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return flg?-x:x;
}
const int maxn=100001;
int ch[maxn][2],fa[maxn],w[maxn],sum[maxn],siz[maxn];
int add[maxn],mul[maxn];
bool rev[maxn];
typedef const int& fast;
il vd upd(fast x){if(x)sum[x]=(sum[ch[x][0]]+sum[ch[x][1]]+w[x])%mod,siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;}
il bool isrt(fast x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
il vd Mul(fast x,fast y){if(x)w[x]=w[x]*y%mod,sum[x]=sum[x]*y%mod,add[x]=add[x]*y%mod,mul[x]=mul[x]*y%mod;}
il vd Add(fast x,fast y){if(x)w[x]=(w[x]+y)%mod,sum[x]=(sum[x]+y*siz[x])%mod,add[x]=(add[x]+y)%mod;}
il vd Rev(fast x){if(x)rev[x]^=1,std::swap(ch[x][0],ch[x][1]);}
il vd down(fast x){if(mul[x]^1)Mul(ch[x][0],mul[x]),Mul(ch[x][1],mul[x]),mul[x]=1;if(add[x])Add(ch[x][0],add[x]),Add(ch[x][1],add[x]),add[x]=0;if(rev[x])Rev(ch[x][0]),Rev(ch[x][1]),rev[x]=0;
}
il vd rotate(fast x){sta int y,z,o;y=fa[x],z=fa[y],o=ch[y][1]==x;if(!isrt(y))ch[z][y==ch[z][1]]=x;fa[x]=z;ch[y][o]=ch[x][!o];fa[ch[x][!o]]=y;fa[y]=x;ch[x][!o]=y;upd(y);
}
il vd splay(fast x){sta int stk[maxn],top;stk[top=1]=x;for(rg int i=x;!isrt(i);i=fa[i])stk[++top]=fa[i];while(top)down(stk[top--]);sta int y,z;for(y=fa[x],z=fa[y];!isrt(x);rotate(x),y=fa[x],z=fa[y])if(!isrt(y))rotate(((ch[y][0]==x)^(ch[z][0]==y))?x:y);upd(x);
}
il vd access(int x){for(rg int y=0;x;x=fa[y=x])splay(x),ch[x][1]=y,upd(x);}
il vd makert(fast x){access(x),splay(x),Rev(x);}
il vd link(fast x,fast y){makert(x),fa[x]=y;}
il vd split(fast x,fast y){makert(x),access(y),splay(y);}
il vd cut(fast x,fast y){split(x,y),fa[x]=ch[y][0]=0;}
main(){freopen("nt2012_wym_tree.in","r",stdin);freopen("nt2012_wym_tree.out","w",stdout);int n=gi(),q=gi();char opt[3];for(rg int i=1;i<=n;++i)w[i]=sum[i]=siz[i]=1,add[i]=0,mul[i]=1,rev[i]=0;for(rg int i=1;i<n;++i)link(gi(),gi());int u,v;while(q--){scanf("%s",opt);if(opt[0]=='+')u=gi(),v=gi(),split(u,v),Add(v,gi());else if(opt[0]=='-')u=gi(),v=gi(),cut(u,v),u=gi(),v=gi(),link(u,v);else if(opt[0]=='*')u=gi(),v=gi(),split(u,v),Mul(v,gi());else u=gi(),v=gi(),split(u,v),printf("%u\n",sum[v]);}return 0;
}

转载于:https://www.cnblogs.com/xzz_233/p/8204245.html

cogs1799 [国家集训队2012]tree(伍一鸣)相关推荐

  1. 数据结构(动态树):[国家集训队2012]tree(伍一鸣)

    [问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...

  2. [国家集训队2012]tree(陈立杰)

    1764. [国家集训队2012]tree(陈立杰) ★★★   输入文件: nt2012_tree.in   输出文件: nt2012_tree.out    简单对比 时间限制:3 s   内存限 ...

  3. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  4. P2619 [国家集训队2]Tree I

    P2619 [国家集训队2]Tree I 链接 分析: 为了确定白边选入的数量,所以给白边加一个权值,二分这个值,然后最小生成树.可以发现白边的数量虽这个值的增大而减小,满足单调性. 有一个问题:如果 ...

  5. [国家集训队2012]电子对撞机nbsp;解题…

    国家集训队2012 电子对撞机(刘洪轩)解题报告 题目: 见http://cogs.pro/cogs/problem/problem.php?pid=1784 Q国最近科学技术不断进步,经过不懈努力, ...

  6. tree(陈立杰)[国家集训队2012]

    时间限制:3.0s   内存限制:1.0GB [大意] 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. [输入格式] 第一行V,E,ne ...

  7. Luogu P2619 [国家集训队2]Tree I 凸优化,wqs二分

    新学的科技.设\(f(x)\)为选\(x\)条白色边的时候的最小生成树权值和,那么可以猜到它应该是一个下凸函数的形式. 如图,图中\(x\)坐标表示选的白色边条数,\(y\)坐标表示获得的权值,那么我 ...

  8. BZOJ2568 [国家集训队2012]比特集合

    Description 比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作: INS M : 将元素 M 插入到集合S中: DEL M : 将集 ...

  9. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

最新文章

  1. 我是如何自学 Python 的
  2. caddy 获取SSL证书报错解决:failed to obtain certificate: acme: Error - One or more domains had a problem
  3. 云边协同 — 协同的类型
  4. 小组结队项目-四则运算
  5. js json对象转字符串_Mock.js模拟数据实现前端独立开发
  6. windowskb2685811补丁_KB898461补丁
  7. redmine安装指引
  8. C 怎么读取Cpp文件_opencv从yaml文件中读取矩阵(c++)
  9. 【算法系列之四】柱状图储水
  10. php 存储过程 sqlsrv_query,php-PHP如何得用sqlsrv函数来调用MSSQL中的存储过程,并返回数据集?...
  11. 导入文件按钮_如何将PPT软件功能配置导入另一台电脑
  12. Java Socket 通信实例 - 转载
  13. drupal.behavior 和 document.ready 没有直接的关系
  14. Vue 使用 print.js 实现打印组件
  15. 二分插入排序(c语言)
  16. Java项目:springboot宠物医院管理系统
  17. 欧几里得算法证明,最小公倍数求法证明
  18. 机器学习--详解人脸对齐算法SDM-LBF
  19. pyTorch入门(六)——实战Android Minist OpenCV手写数字识别(附源码地址)
  20. Python3.5 ‘wb’与‘w’区别以及写入excel的常见错误

热门文章

  1. 第51课 拍手游戏--2021.09.19
  2. php通过使用curl获取http或者https的响应信息的方式
  3. 操作系统课设之基于信号量机制的并发程序设计
  4. java 文本文件 append_java 将字符串下载为文本文件
  5. Web前端笔记-two.js画三角形及画tip含tip旋转
  6. Java工作笔记-对反射的进一步理解
  7. OllyDbg笔记-修改Messagebox的标题
  8. C++工作笔记-WM_KEYFIRST和WM_KEYDOWN的用法
  9. 让我们来比较C#,C++和Java之间重写虚函数的区别
  10. java 声明静态类,为什么你不能在Java中将类声明为静态?