小豆现在有一个数 x,初始值为 1。小豆有 QQ 次操作,操作有两种类型:

1 m:将 x变为 x × m,并输出 x mod M

2 pos:将 x 变为 x 除以第 pos次操作所乘的数(保证第 pos 次操作一定为类型 1,对于每一个类型 1 的操作至多会被除一次),并输出 x mod M。

第一眼真的看不出来是个线段树的题,仔细思考看题解后才明白思路,以时间为轴,创建以每次操作次数为叶子节点的线段树,每次操作只需更改叶子

节点的值,最终pushup上去后,tr[1]就是我们要找的x的值

 1 # include<iostream>
2 # include<algorithm>
3 # include<cstring>
4 # define int long long
5 # define endl "\n"
6 using namespace std;
7 const int N = 1e5+10;
8 int n,m;
9 struct node{
10 int l,r;
11 int v;
12 }tr[4*N];
13
14 void pushup(int u){
15 tr[u].v =( tr[u<<1|1].v*tr[u<<1].v)%m;/*向上更新父节点的值*/
16 }
17
18 void build(int u,int l,int r){
19 tr[u].l = l,tr[u].r = r;
20 if(l == r){
21 tr[u].v = 1;/*初始化所有操作值初始为 1 */
22 return;
23 }
24 int mid = l+r>>1;
25 build(u<<1,l,mid),build(u<<1|1,mid+1,r);
26 pushup(u);
27 }
28
29 void modify(int u,int x,int v){
30 if(tr[u].l == x && tr[u].r == x){
31 tr[u].v = (tr[u].v*v)%m;
32 return;
33 }
34 int mid = tr[u].l+tr[u].r>>1;
35 if(x<=mid) modify(u<<1,x,v);
36 else modify(u<<1|1,x,v);
37 pushup(u);
38 }
39
40 void remodify(int u,int x){
41 if(tr[u].l == x && tr[u].r == x){
42 tr[u].v = 1;
43 return;
44 }
45 int mid = tr[u].l+tr[u].r>>1;
46 if(x<=mid) remodify(u<<1,x);
47 else remodify(u<<1|1,x);
48 pushup(u);
49 }
50
51
52 int tt;
53 void solve(){
54 cin>>n>>m;
55 // memset(tr,0,sizeof tr);
56 build(1,1,n);
57 int kk = 0;/*记录一下操作次数*/
58 while(n--){
59 int op,v;
60 cin>>op>>v;
61 kk++;
62 if(op == 1){
63 modify(1,kk,v);
64 cout<<(tr[1].v)%m<<endl;
65 }
66 else{
67 remodify(1,v);
68 cout<<(tr[1].v)%m<<endl;
69 }
70 }
71
72 }
73 signed main(){
74 ios::sync_with_stdio(false);
75 cin.tie(0);
76 cout.tie(0);
77 cin>>tt;
78 while(tt--) solve();
79
80 return 0;
81 }

在乘的时候有可能爆int,所以要边乘边取模,开long long

(线段树) P4588 数学计算的更多相关文章

  1. HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. bzoj4821 && luogu3707 SDOI2017相关分析(线段树,数学)

    题目大意 给定n个元素的数列,每一个元素有x和y两种元素,现在有三种操作: \(1\ L\ R\) 设\(xx\)为\([l,r]\)的元素的\(x_i\)的平均值,\(yy\)同理 求 \(\fra ...

  3. HDU 1828 线段树+扫描线(计算矩形周长并)

    题意:给你n个矩形,然后矩形有可能重叠,要你求周长 思路:首先碰到这种矩形在数轴上那么第一反应应该想到的是扫描线, 做周长我们有两种方法 第一种,我们可以分开两部分求,第一遍求x轴上的贡献,第二遍求y ...

  4. HAOI2012高速公路bzoj2752 (线段树,数学)

    题目大意: 给定一个长度为n的链,一共m次操作 对于每次操作 \(C\ l\ r\ x\)表示将第l个点到第r个点之间的所有道路的权值增加v \(Q\ l\ r\)在第l个到第r个点里等概率随机取出两 ...

  5. POJ 1151 线段树+扫描线(计算矩形面积并)

    前一篇博客有了讲解就不再叙述了 #include<cstdio> #include<cstring> #include<cmath> #include<ios ...

  6. loj2163 / bzoj2212 / P3521 [POI2011]ROT-Tree Rotations(线段树合并)

    P3521 [POI2011]ROT-Tree Rotations loj2163 [POI2011]ROT-Tree Rotations(数据加强) (loj的数据套了个fread优化才过...) ...

  7. CodeForces 834D The Bakery(线段树优化DP)

    Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...

  8. luogu P3899 [湖南集训]谈笑风生 线段树合并

    Code: #include<bits/stdc++.h> #define maxn 300002 #define ll long long using namespace std; vo ...

  9. [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)

    [FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...

随机推荐

  1. 【HTML】学习路径3-段落标签和标题标签

    第一章:标题标签 <h1>  </h1> <h2>  </h2> 等等... 数字越大,字体尺寸越小. <!--标题会加粗.独占一行--> ...

  2. 【HTML】学习路径2-设置文档类型、网页编码、文件注释

    第一章:设置文档类型 我们通常在html文件最前面写一行: <!DOCTYPE html> 这玩意有啥用? https://developer.mozilla.org/zh-CN/docs ...

  3. OpenJudge 1.5.15 银行利息

    15:银行利息 总时间限制: 1000ms 内存限制: 65536kB 描述 农夫约翰在去年赚了一大笔钱!他想要把这些钱用于投资,并对自己能得到多少收益感到好奇.已知投资的复合年利率为R(0到20之间 ...

  4. 【Traefik二次开发】服务 Service 开发

    Service 定义 https://doc.traefik.io/traefik/routing/services/ The Services are responsible for configu ...

  5. Altium Designer 18学习

    目录 目录 快捷键 通孔 敷铜 修改铜皮与导线之间的间隔 去除指定敷铜区域 DRC设计规则检查问题: 快捷键 EJC 快速跳转到器件 M 移动 CTRL+M 测量距离 通孔 敷铜 放置多边形平面 -- ...

  6. KingbaseES 绑定变量与游标共享

    对于重复执行的SQL,需要使用绑定变量,避免SQL的重复解析.但是,并不是说使用了绑定变量,就一定能避免硬解析.具体可以参见:https://www.cnblogs.com/kingbase/p/16 ...

  7. Sync包

    sync同步包 Mutex互斥锁: 能够保证在同一时间段内仅有一个goroutine持有锁,有且仅有一个goroutine访问共享资源,其他申请锁的goroutine将会被阻塞直到锁被释放.然后重新争 ...

  8. linux下安装Elasticsearch(单机版和集群版)

    一.linux下安装Elasticsearch(单机) 1.软件下载 下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsea ...

  9. Python数据科学手册-Numpy数组的计算:比较、掩码和布尔逻辑,花哨的索引

    Numpy的通用函数可以用来替代循环, 快速实现数组的逐元素的 运算 同样,使用其他通用函数实现数组的逐元素的 比较 < > 这些运算结果 是一个布尔数据类型的数组. 有6种标准的比较操作 ...

  10. kibana配置文件kibana.yml参数详解

    server.port: 默认值: 5601 Kibana 由后端服务器提供服务,该配置指定使用的端口号. server.host: 默认值: "localhost" 指定后端服务 ...