小豆现在有一个数 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. what the difference betweent pin page and lock page ?

    以前在项目中,大家为了避免自己使用的page被换出,使用的方式是mlock,从mlock的实现的看,它限制了page被swap, 然后在一个swap off的系统中,这样其实和mlock调用与否没有关 ...

  2. JavaScript之数组常用API

    这篇文章主要帮助大家简单理解数组的一些常用API用法,许多小伙伴常用方法记不住?别急,看完下面的介绍您一定就会明白各个方法是如何用的了.该文章适合新手小白看,大佬可以多多指点️! 1.数组的创建以及A ...

  3. iOS 组件化及二进制化的探索

    组件化的优缺点 组件化的拆分 组件与组件之间如何进行通讯(路由) 从Cocopods拉取代码的过程 远程索引库里很多的.spec文件,该文件记录了很多内容,如用户名,框架名称,描述,框架的地址 Pod ...

  4. KingbaseES 工具sys_dump,sys_restore使用介绍

    说明: KingbaseES V8R6版本中自带数据库备份导出sys_dump,和备份恢复sys_restore工具. sys_dump:把KingbaseES数据库抽取为一个脚本文件或其他归档文件. ...

  5. KingbaseES V8R3集群管理维护案例之---集群迁移单实例架构

    案例说明: 在生产中,需要将KingbaseES V8R3集群转换为单实例架构,可以采用以下方式快速完成集群架构的迁移. 适用版本: KingbaseES V8R3 当前数据库版本: TEST=# s ...

  6. git 根据历史 commitID 拉分支

    1. git log -g 查看已commit的信息 2. 根据commit信息找到对应的commitID 3. 执行一下命令来创建新的分支 ### 1. 方法一:创建一个基于commitId的分支, ...

  7. .NET 反向代理 YARP 通过编码方式配置域名转发

    前面介绍了 YARP 通过配置文件的方式配置代理转发(传送门),而众所周知,微软的一贯作风就是能通过配置文件做的事情,通过编码的方式也能实现!YARP 也不例外,废话不多说,直接上代码! 首先,参照官 ...

  8. 在Kuboard上安装 Ingress Controller

    快速安装 # 只在 master 节点执行 kubectl apply -f https://kuboard.cn/install-script/v1.18.x/nginx-ingress.yaml ...

  9. nginx+gunicorn部署Django项目

    实际采用的nginx.conf文件内容: server { charset utf-8; listen 80; server_name ip; access_log /webapps/project/ ...

  10. 【论文翻译】KLMo: Knowledge Graph Enhanced Pretrained Language Model with Fine-Grained Relationships

    KLMo:建模细粒度关系的知识图增强预训练语言模型 (KLMo: Knowledge Graph Enhanced Pretrained Language Model with Fine-Graine ...