首页 > 其他分享 >P4588 [TJOI2018] 数学计算

P4588 [TJOI2018] 数学计算

时间:2024-01-23 13:11:26浏览次数:27  
标签:P4588 rs int tr 操作 return 数学计算 TJOI2018 change

题目描述
小豆现在有一个数 x,初始值为
1。小豆有 Q 次操作,操作有两种类型:
1 m:将 x 变为 ×*m,并输出 xmodM。
2 pos:将 x 变为 x 除以第 pos 次操作所乘的数(保证第 pos 次操作一定为类型 1,对于每一个类型 1 的操作至多会被除一次),并输出 xmodM。
输入格式
一共有 t 组输入。对于每一组输入,第一行是两个数字,Q,M。接下来 Q 行,每一行为操作类型 op,操作编号或所乘的数字 m(保证所有的输入都是合法的)。
输出格式
对于每一个操作,输出一行,包含操作执行后的 xmodM 的值。
题目分析
将每次操作当成一个叶子节点,用线段树来维护区间积。
先建树,先将所有的叶子节点初始化为1,在每次的操作1中,将叶子节点值改为m,并pushup一下(向上更新区间积)
在每次的操作2中,将叶子节点重新改为1,并进行pushup操作一次。
代码演示
`#include

include

include

include<bits/stdc++.h>

using namespace std;

define ll long long

define N 200020

define ls u<<1

define rs u<<1|1

int d;
struct tree
{
int l,r;
ll mx;

}tr[N4];
void pushup(int u)
{
tr[u].mx=tr[ls].mx
tr[rs].mx%d;
return ;

}
void build(int u,int l,int r)
{
tr[u]={l,r,1};
if(lr)
{
return ;
}
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
}
void change(int x,int u,int y)
{
if(tr[u].l
x&&tr[u].r==x)
{
tr[u].mx=y%d;
return ;
}
int m=tr[u].l+tr[u].r>>1;
if(x<=m)
change(x,ls,y);
else
change(x,rs,y);
pushup(u);

}
int query(int u,int l,int r)
{
if(l<=tr[u].l&&tr[u].r<=r)
return tr[u].mx%d;
int m=tr[u].l+tr[u].r>>1;
int ans=1;
if(l<=m) ans=query(ls,l,r)%d;
if(r>m) ans=ans*query(rs,l,r)%d;
return ans%d;
}
int main()
{
cin.tie(NULL);
cout.tie(nullptr);
ios_base::sync_with_stdio(false);
int q,m;
int n=0;
int c,y;
int t;
cin>>t;
while(t--)
{
cin>>m>>d;
build(1,1,m);
for(int i=1;i<=m;i++)
{
cin>>c>>y;
if(c==1)
{
change(i,1,y);
cout<<query(1,1,m)%d<<'\n';
}
else {
change(y,1,1);
cout<<query(1,1,m)%d<<'\n';
//cout<<t<<"\n";
}

 }

 }
 return 0;

}`
请注意:思路来自董晓算法,哔哩哔哩搜索董晓算法。

标签:P4588,rs,int,tr,操作,return,数学计算,TJOI2018,change
From: https://www.cnblogs.com/wner/p/17982230

相关文章

  • MKL.NET:为.NET开发者提供高性能数学计算支持的开源库
    MKL.NET:为.NET开发者提供高性能数学计算支持的开源库编程乐趣​ ​关注他 你经常看TA的内容MKL是英特尔推出的一套功能强大、性能优化的数学库,主要是采用C/C++编写的。今天给大家推荐一个MKL的.Net版本,让我们无需与C/C++打交道,方便我们集成到应......
  • mysql数学计算
    mysql数学计算一、取整函数1、向上取整CEIL(X)和CEILING(X):返回大于等于X的最小INT型整数。SELECTCEIL(2.3)--32、向下取整FLOOR(X):返回小于等于X的最大INT型整数。SELECTFLOOR(2.3)--23、舍入函数ROUND(X,D):X表示要处理的数,D......
  • Go语言中的数学计算
    数学常量math.E //自然对数的底,2.718281828459045math.Pi //圆周率,3.141592653589793math.Phi //黄金分割,长/短,1.618033988749895math.MaxInt //9223372036854775807uint64(math.MaxUint) //得先把MaxUint转成uint64才能输出,18446744073709551615math.MaxFloat64 //1.797693......
  • MATLAB符号数学计算
       符号计算存放的是精确数据,耗存储空间,运行速度慢,但结果精度高;数值计算则是以一定精度来计算的,计算结果有误差,但是运行速度快。两者的区别是: 数值计算的表达式、矩阵变量中不允许有未定义的自由变量,而符号计算可以含有未定义的符号变量。一、符号对象和符号表达式close......
  • [TJOI2018] 游园会题解
    [TJOI2018]游园会(dp套dp)目录[TJOI2018]游园会(dp套dp)前言:题目简化:解题思路:较为简单的一步:较为困难的步骤思路总结代码呈现:注释/后记:前言:这是和dp套dp的初遇,这不得好好了解一下。题目简化:先把题目进行简化,就是要构造字符串,对于$len\in[0,k]$满足以下条件:只包含......
  • 数学计算
    P4588[TJOI2018]数学计算考虑将所有\(1\)操作涉及到的数存入线段树中,初始为\(1\)。1操作:在某个位置修改为某个值。2操作:在某个位置修改为\(1\)。查询:查询所有数的乘积。无需懒标记,可以直接将所有操作数按照下标丢进去,也可以先提取出操作1(线段树的大小会小一些)。直接做......
  • 前端 数学计算 big.js 使用
     解决0.1+0.2不等于0.3的问题 解决方法方法一,同时扩大倍数再除以相同的倍数 0.1+0.2//0.30000000000000004(0.1*10+0.2*10)/10//0.3方法二,第三方库bignumber.jsmath.jsbig.js big.js基础用法运算//运算//constplus=Big(0.1).p......
  • 数学计算常用数值
    指数对数e=2.71828ln2=0.7 ln3=1.1ln5=1.6log10(2)=0.3;log10(3)=0.5log10(5)=0.7log2(10)=3.3ln(10)=2.3(用于对数转换计算,如ln(5)=ln10*log10(5)=2.3*0.7=1.6)三角函数平方、平方根11²=12112²=14413²=16914²=19615²=22516²=25......
  • MATLAB R2023a Mac(专业编程和数学计算软件)
    MATLABr2023是一款功能强大的编程和数学计算工具,取用于处理科学、工程和数学应用程序中的复杂数据,可用于科学研究、信号处理、计算机视觉,机器学习,人工智能以及相关软件领域。适用范围:MATLAB是一款功能强大的编程工具,可以帮助您完成科学、工程或数学应用程序的开发工作。在您进......
  • P4590 [TJOI2018] 游园会
    P4590[TJOI2018]游园会题意小豆参加了NOI的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是\(N,O,I\)的字样。在会场。上他收集到了\(K\)个奖章组成的串。兑奖规则是奖章串和兑奖串的最长公共子序列长度为小豆最后奖励的等级。现在已知兑奖串长度为\(N\),并且在兑奖串......