(线段树) P4588 数学计算
小豆现在有一个数 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 数学计算的更多相关文章
- HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- bzoj4821 && luogu3707 SDOI2017相关分析(线段树,数学)
题目大意 给定n个元素的数列,每一个元素有x和y两种元素,现在有三种操作: \(1\ L\ R\) 设\(xx\)为\([l,r]\)的元素的\(x_i\)的平均值,\(yy\)同理 求 \(\fra ...
- HDU 1828 线段树+扫描线(计算矩形周长并)
题意:给你n个矩形,然后矩形有可能重叠,要你求周长 思路:首先碰到这种矩形在数轴上那么第一反应应该想到的是扫描线, 做周长我们有两种方法 第一种,我们可以分开两部分求,第一遍求x轴上的贡献,第二遍求y ...
- HAOI2012高速公路bzoj2752 (线段树,数学)
题目大意: 给定一个长度为n的链,一共m次操作 对于每次操作 \(C\ l\ r\ x\)表示将第l个点到第r个点之间的所有道路的权值增加v \(Q\ l\ r\)在第l个到第r个点里等概率随机取出两 ...
- POJ 1151 线段树+扫描线(计算矩形面积并)
前一篇博客有了讲解就不再叙述了 #include<cstdio> #include<cstring> #include<cmath> #include<ios ...
- loj2163 / bzoj2212 / P3521 [POI2011]ROT-Tree Rotations(线段树合并)
P3521 [POI2011]ROT-Tree Rotations loj2163 [POI2011]ROT-Tree Rotations(数据加强) (loj的数据套了个fread优化才过...) ...
- CodeForces 834D The Bakery(线段树优化DP)
Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...
- luogu P3899 [湖南集训]谈笑风生 线段树合并
Code: #include<bits/stdc++.h> #define maxn 300002 #define ll long long using namespace std; vo ...
- [FJOI2015]火星商店问题(线段树分治,可持久化,Trie树)
[FJOI2015]火星商店问题 前天考了到线段树分治模板题,全场都切了,就我不会QAQ 于是切题无数的Tyher巨巨就告诉我:"你可以去看看火星商店问题,看了你就会了." 第一道 ...
随机推荐
- 一些有用的数学知识(Updating)
文章目录 拉格朗日插值公式 微分中值定理 费马引理 拉格朗日中值定理 柯西中值定理 洛必达法则 连分数(NOI2021 D2T2 考点) 定义 结论 定理1 定理2 定理3 定理4 定理5 欧拉公式 ...
- 第十二章 Kubernetes的服务暴露插件--traefik
1.前言 之前部署的coredns实现了k8s的服务在集群内可以被自动发现,那么如何使得服务在k8s集群外被使用和访问呢? 使用nodeport星的Service:此方法只能使用iptables模型, ...
- KingbaseESV8R6等待事件之lwlock buffer_content
前言 等待事件是排查数据库性能的指标之一.简单理解,cpu在处理业务时由于业务逻辑,和不可避免的数据库其他原因造成的前台进程等待,这里的等待事件包含buffer类,io类,以及网络类等等,当我们遇到等 ...
- KingbaseES R6 集群repmgr witness 手工配置案例
使用见证服务器: 见证服务器是一个正常的KingbaseES实例,不是流复制群集的一部分; 其目的是,如果发生故障转移情况,则提供证明它是主服务器本身不可用的证据,而不是例如在不同物理位置之间的网络分 ...
- Java套接字实现应用程序对数据库的访问
最近在完成软件体系结构上机实验时,遇到一个有点点小难度的选做题,题目信息如下: 利用套接字技术实现应用程序中对数据库的访问.应用程序只是利用套接字连接向服务器发送一个查询的条件,而服务器负责对数据库的 ...
- BUUCTF Misc 被偷走的文件
首先下载文件打开 得到一个流量文件 用wireshark打开 打开后 进行分析 看到有ftp流量,于是过滤ftp 看到被偷走的是flag.rar 接下用binwalk进行分离 binwalk -e f ...
- 在终端启动Python时报错的解决
最近,在终端启动Python时,报了一个错误: 1 Failed calling sys.__interactivehook__ 2 Traceback (most recent call last) ...
- 重新安装kuboard后,原先配置的CI/CD命令都没了,需要重新创建
背景介绍 使用如下命令创建的kuboard服务,上一层用nginx设置代理,用域名访问使用的 docker run -d \ --restart=always \ --name=kuboard \ - ...
- Kubernetes中使用ClusterDNS进行服务发现
在k8s集群中,服务是运行在Pod中的,Pod的发现和副本间负载均衡是我们面临的问题.我们使用Service解决了负载均衡的问题,但是集群环境中,service经常伴随着ip的变动而变动,得益于kub ...
- 计算shell 脚本的执行时间
# shell_time.sh #!/bin/bash UseTime () { startTime_s=`date +%s` # 获取从1970-01-01 00:00:00 UTC到现在的秒数 $ ...