原题链接:https://www.luogu.org/problemnew/show/P1501

Tree II

题目描述

一棵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的余数。

输入输出格式
输入格式:

第一行两个整数n,q

接下来n-1行每行两个正整数u,v,描述这棵树

接下来q行,每行描述一个操作

输出格式:

对于每个/对应的答案输出一行

输入输出样例
输入样例#1:

3 2
1 2
2 3

  • 1 3 4
    / 1 1
输出样例#1:

4

说明

10%的数据保证,1<=n,q<=2000

另外15%的数据保证,1<=n,q<=5*10^4,没有-操作,并且初始树为一条链

另外35%的数据保证,1<=n,q<=5*10^4,没有-操作

100%的数据保证,1<=n,q<=105,0<=c<=104

题解

差不多算是LCT\mathcal{LCT}LCT比较常规的操作了吧。。。没有思维难度啊。。。

标记下传什么的类比线段树就好了,貌似要开unsignedint\mathcal{unsigned\ \ int}unsigned  int,因为那个猥琐的模数的平方刚好大于int\mathcal{int}int:
51061×51061=2607225721&gt;231=214748364851061\times51061=2607225721&gt;2^{31}=214748364851061×51061=2607225721>231=2147483648

代码
#include<bits/stdc++.h>
#define ls son[v][0]
#define rs son[v][1]
#define X(a) a=(a*s)%mod
#define J(a) a=(a+s)%mod
#define uint unsigned int
using namespace std;
const uint M=1e5+5,mod=51061;
uint n,q,dad[M],son[M][2],sta[M],add[M],mul[M],sum[M],siz[M],val[M];
bool rev[M];
bool notroot(int v){return son[dad[v]][0]==v||son[dad[v]][1]==v;}
void up(int v){sum[v]=(val[v]+sum[ls]+sum[rs])%mod;siz[v]=1+siz[ls]+siz[rs];}
void turn(int v){swap(ls,rs);rev[v]^=1;}
void padd(int v,int s){J(val[v]);J(add[v]);s*=siz[v];J(sum[v]);}
void pmul(int v,int s){X(sum[v]);X(val[v]);X(add[v]);X(mul[v]);}
void push(int v)
{if(mul[v]!=1)pmul(ls,mul[v]),pmul(rs,mul[v]),mul[v]=1;if(add[v])padd(ls,add[v]),padd(rs,add[v]),add[v]=0;if(rev[v]){if(ls)turn(ls);if(rs)turn(rs);rev[v]=0;}
}
void spin(int v)
{int f=dad[v],ff=dad[f],k=son[f][1]==v,w=son[v][!k];if(notroot(f))son[ff][son[ff][1]==f]=v;son[v][!k]=f;son[f][k]=w;if(w)dad[w]=f;dad[f]=v;dad[v]=ff;up(f);up(v);
}
void splay(int v)
{int f,ff,top=0,u=v;sta[++top]=u;while(notroot(u))sta[++top]=u=dad[u];while(top)push(sta[top--]);while(notroot(v)){f=dad[v];ff=dad[f];if(notroot(f))spin((son[f][0]==v)^(son[ff][0]==f)?v:f);spin(v);}
}
void access(int v){for(int f=0;v;v=dad[f=v])splay(v),rs=f,up(v);}
void beroot(int v){access(v);splay(v);turn(v);}
void split(int x,int y){beroot(x);access(y);splay(y);}
void link(int x,int y){beroot(x);dad[x]=y;}
void cut(int x,int y){split(x,y);dad[x]=son[y][0]=0;up(y);}
void ad(int a,int b,int val){split(a,b);padd(b,val);}
void mu(int a,int b,int val){split(a,b);pmul(b,val);}
void in()
{int a,b;scanf("%d%d",&n,&q);for(int i=1;i<=n;++i)sum[i]=val[i]=mul[i]=1;for(int i=1;i<n;++i)scanf("%d%d",&a,&b),link(a,b);
}
void ac()
{char ch[10];int a,b,c,d;for(int i=1;i<=q;++i){scanf("%s",ch);switch(ch[0]){case '+':scanf("%d%d%d",&a,&b,&c);ad(a,b,c);break;case '-':scanf("%d%d%d%d",&a,&b,&c,&d);cut(a,b);link(c,d);break;case '/':scanf("%d%d",&a,&b);split(a,b);printf("%d\n",sum[b]);break;case '*':scanf("%d%d%d",&a,&b,&c);mu(a,b,c);}}
}
int main()
{in();ac();return 0;
}

Luogu1501[国家集训队] Tree II相关推荐

  1. P1501 [国家集训队]Tree II

    \(\color{#0066ff}{ 题目描述 }\) 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数 ...

  2. P2619 [国家集训队]Tree I(WQS二分/带权二分/最小生成树)

    P2619 [国家集训队]Tree I 给定一个n个点,m条边的无向图,每条边有一个颜色黑色或者白色,求解恰好有k条白色边的最小生成树. 那么看到恰好选择k个的最优性问题,我们可以利用WQS二分解决, ...

  3. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

  4. 洛谷:P2619 [国家集训队]Tree I(最小生成树、二分加权)

    国家集训队是不一样 题意: 很清晰不赘述 思路: 没写过应该想不到. 可以证明给所有白边枚举加权,一定有一种权值情况可以满足恰好 need 条白边,同时是最小生成树. 观察可以发现具有二分性,二分的不 ...

  5. BZOJ2654/COGS1764 [2012国家集训队]tree(陈立杰) [生成树,二分]

    BZOJ传送门,COGS传送门 tree Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V, ...

  6. [国家集训队] tree Ⅱ

    bzoj2631(权限题...):链接 落咕:链接 考察的是LCT维护链上信息. 但是这个题不一样的是又有加法又有乘法...(有木有想到落咕的模板--线段树2qwq) 因为乘法的运算优先度比加法高,所 ...

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

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

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

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

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

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

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

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

最新文章

  1. Chrome用户请尽快更新:谷歌发现两个严重的零日漏洞
  2. Python学习 第2天 IDE开发工具
  3. how is my appointment opened in HCP
  4. linux之cut命令使用和总结
  5. 什么是计算机网络教学反思,《计算机网络实训之常用的网络工具》教学反思
  6. commit git idea 速度慢_关于Git,这篇文章还不够吗?
  7. python 中json和字符串互相转换
  8. 2018-07-25 异想天开
  9. 用CentOS 6快速配置一台企业级Web代理服务器
  10. Android studio 手机扫描二维码功能
  11. iOS 通讯录备份、恢复
  12. Android 配置文件锁设置
  13. 安卓上利用百度输入法提供的导入词库与个性短语,批量造词方便输入
  14. 自然语言处理中的迁移学习(下)
  15. (转载)如何写论文之标题篇
  16. 数字证书原理是什么?
  17. Obama Praises Japanese Partnership
  18. filezilla关闭更新检测
  19. 揭开真实的加密币地下瑞士银行, 特种部队巡逻、罗斯柴尔德家族投资投资的背后堪比现实版007...
  20. windows7下休眠不断网

热门文章

  1. java中的 关键词vali_Java中的关键字volatile详解
  2. gwas snp 和_Science | 群体研究新思路:De novo + GWAS
  3. 409.最长回文串(力扣leetcode) 博主可答疑该问题
  4. android控件缩放后居中,三大布局的基本摆放属性总结,以及imageVIew图片摆放的缩放问题...
  5. 查询字符串中子字符串所有出现位置
  6. ubuntu上如何安装mysql
  7. 1052. Linked List Sorting (25)再
  8. mysql isamchk_mysqlcheck与myisamchk的区别
  9. Java1.5并发包下阻塞队列的生产者与消费者功能简单实现
  10. mybatis if test 之 like concat()函数