LCT裸题

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

这个膜数不会爆unsigned int

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<algorithm>
  4. #include<cctype>
  5. using namespace std;
  6. #define rg register
  7. #define il inline
  8. #define sta static
  9. #define vd void
  10. #define int unsigned int
  11. #define mod 51061
  12. il int gi(){
  13. sta int x,flg;sta char ch;
  14. x=flg=0,ch=getchar();
  15. while(!isdigit(ch)){if(ch=='-')flg=-1;ch=getchar();}
  16. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
  17. return flg?-x:x;
  18. }
  19. const int maxn=100001;
  20. int ch[maxn][2],fa[maxn],w[maxn],sum[maxn],siz[maxn];
  21. int add[maxn],mul[maxn];
  22. bool rev[maxn];
  23. typedef const int& fast;
  24. 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;}
  25. il bool isrt(fast x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
  26. 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;}
  27. 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;}
  28. il vd Rev(fast x){if(x)rev[x]^=1,std::swap(ch[x][0],ch[x][1]);}
  29. il vd down(fast x){
  30. if(mul[x]^1)Mul(ch[x][0],mul[x]),Mul(ch[x][1],mul[x]),mul[x]=1;
  31. if(add[x])Add(ch[x][0],add[x]),Add(ch[x][1],add[x]),add[x]=0;
  32. if(rev[x])Rev(ch[x][0]),Rev(ch[x][1]),rev[x]=0;
  33. }
  34. il vd rotate(fast x){
  35. sta int y,z,o;y=fa[x],z=fa[y],o=ch[y][1]==x;
  36. if(!isrt(y))ch[z][y==ch[z][1]]=x;fa[x]=z;
  37. ch[y][o]=ch[x][!o];fa[ch[x][!o]]=y;
  38. fa[y]=x;ch[x][!o]=y;
  39. upd(y);
  40. }
  41. il vd splay(fast x){
  42. sta int stk[maxn],top;stk[top=1]=x;
  43. for(rg int i=x;!isrt(i);i=fa[i])stk[++top]=fa[i];
  44. while(top)down(stk[top--]);
  45. sta int y,z;
  46. for(y=fa[x],z=fa[y];!isrt(x);rotate(x),y=fa[x],z=fa[y])
  47. if(!isrt(y))rotate(((ch[y][0]==x)^(ch[z][0]==y))?x:y);
  48. upd(x);
  49. }
  50. il vd access(int x){for(rg int y=0;x;x=fa[y=x])splay(x),ch[x][1]=y,upd(x);}
  51. il vd makert(fast x){access(x),splay(x),Rev(x);}
  52. il vd link(fast x,fast y){makert(x),fa[x]=y;}
  53. il vd split(fast x,fast y){makert(x),access(y),splay(y);}
  54. il vd cut(fast x,fast y){split(x,y),fa[x]=ch[y][0]=0;}
  55. main(){
  56. freopen("nt2012_wym_tree.in","r",stdin);
  57. freopen("nt2012_wym_tree.out","w",stdout);
  58. int n=gi(),q=gi();char opt[3];
  59. for(rg int i=1;i<=n;++i)w[i]=sum[i]=siz[i]=1,add[i]=0,mul[i]=1,rev[i]=0;
  60. for(rg int i=1;i<n;++i)link(gi(),gi());
  61. int u,v;
  62. while(q--){
  63. scanf("%s",opt);
  64. if(opt[0]=='+')u=gi(),v=gi(),split(u,v),Add(v,gi());
  65. else if(opt[0]=='-')u=gi(),v=gi(),cut(u,v),u=gi(),v=gi(),link(u,v);
  66. else if(opt[0]=='*')u=gi(),v=gi(),split(u,v),Mul(v,gi());
  67. else u=gi(),v=gi(),split(u,v),printf("%u\n",sum[v]);
  68. }
  69. return 0;
  70. }

cogs1799 [国家集训队2012]tree(伍一鸣)的更多相关文章

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

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

  2. [COGS 1799][国家集训队2012]tree(伍一鸣)

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

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

    [国家集训队2012]tree(陈立杰) 题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. INPUT 第一行V,E,need分别表示 ...

  4. [国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)

    tree 时间限制: 3 Sec  内存限制: 512 MB 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入 第一行V, ...

  5. Tsinsen A1303. tree(伍一鸣) LCT

    LCT的各种操作... . cut link add mul size rev query 写的效率不够高... BZOJ上似乎TLE. ... A1303. tree(伍一鸣) 时间限制:2.5s  ...

  6. [国家集训队2012]middle

    http://cogs.pro:8080/cogs/problem/problem.php?pid=1763 二分答案x 把区间内>=x的数设为1,<x的数设为-1 左端点在[a,b]之间 ...

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

    题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...

  8. [国家集训队2012]JZPFAR

    [国家集训队2012]JZPFAR 题目 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个(或多个)点距离( ...

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

    P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...

随机推荐

  1. PHP设计模式系列 - 解释器模式

    解释器模式 解释器模式 用于分析一个实体的关键元素,并且针对每个元素提供自己的解释或相应动作.解释器模式非常常用,比如PHP的模板引擎 就是非常常见的一种解释器模. 代码: <?php //解释 ...

  2. 51nod 1589 移数博弈【桶排序+链表】

    1589 移数博弈 基准时间限制:1 秒 空间限制:262144 KB 分值: 80 难度:5级算法题   小A和小B在玩一个游戏. 他们拥有一个数列. 小A在该数列中选择出最大的那个数,然后移出该数 ...

  3. python第十六课——ascii码

    2.ascii码 美国设计出来的一张编码表,将涉及的字符都编号了,底层仍然还是进行二进制的运算: 记住:3个范围段 1).'0' --> 码值:48 2).'A' --> 码值:65 3) ...

  4. openfalcon-0.2 配置

    hbs 配置文件 { "debug": true, "database": "openfalcon:123456@tcp(172.16.230.188 ...

  5. 一般处理程序中用到session时

    一般处理程序ashx文件使用session 1.先引用System.Web.SessionState这个命名空间, 2.如果是要在HttpHandler中读取Session的内容,就要在实现IHttp ...

  6. ubuntu16.04常见的问题解决方案

    问题一:关于咖啡主机和其他服务器厂商和个人虚拟机VM10安装ubuntu16.04 ubuntu16.04默认是没有root用户的,要想有必须要通过用户创建,通常安装ubuntu16.04会有个让你创 ...

  7. pom xml testng

    <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId ...

  8. CAN总线实际运用分析问题。

    组态设计   人机交互  上位机  分布式控制系统  下位机  (单片机/PLC)  CAN总线用线缆   连接方式(手牵手,T型)    CAN总线接地(大地) http://bbs.gongkon ...

  9. C++ 容器类型成员

    类型别名   iterator 此容器类型的迭代类型 const_iterator 可以读取元素,但不能修改元素的迭代器类型 size_type 无符号整数类型,足够保存此种容器类型最大可能容器的大小 ...

  10. swoft orm中的坑(针对实体类的属性名称和数据库字段不相等)

    最近在用swoft的orm,发现了一些问题: 首先看下实体类的定义 它的属性名称和所映射的数据库字段名不一致,这个就会导致蛋疼的问题,首先,在我们使用orm的时候,应该使用哪个字段? 我直接说结论,在 ...