【题解】Luogu P4588 [TJOI2018]数学计算

原题传送门

这题是线段树的模板题

显而易见,直接模拟是不好模拟的(取模后就不好再除了)

我们按照时间来建一颗线段树

线段树初始值都为1,用来维护乘积

第一种操作就在当前时间所对应的节点上把乘数改成m

第二种操作就是把第pos个节点的乘数该回1

每次询问的答案就是线段树根节点维护的数值(pushup时要取模)

#include <bits/stdc++.h>
#define N 100005
#define ll long long
#define getchar nc
using namespace std;
inline char nc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline ll read()
{
    register ll x=0,f=1;register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return x*f;
}
inline void write(register int x)
{
    if(!x)putchar('0');if(x<0)x=-x,putchar('-');
    static int sta[20];register int tot=0;
    while(x)sta[tot++]=x%10,x/=10;
    while(tot)putchar(sta[--tot]+48);
}
int n;
ll mod;
struct SegmentTree{
    ll mul[N<<3];
    inline void init(register int x,register int l,register int r)
    {
        mul[x]=1;
        if(l==r)
            return;
        int mid=l+r>>1;
        init(x<<1,l,mid);
        init(x<<1|1,mid+1,r);
    }
    inline void pushup(register int x)
    {
        mul[x]=mul[x<<1]*mul[x<<1|1]%mod;
    }
    inline void update(register int x,register int l,register int r,register int pos,register int v)
    {
        if(l==r)
        {
            mul[x]=v;
            return;
        }
        int mid=l+r>>1;
        if(pos<=mid)
            update(x<<1,l,mid,pos,v);
        else
            update(x<<1|1,mid+1,r,pos,v);
        pushup(x);
    }
}tr;
int main()
{
    int T=read();
    while(T--)
    {
        n=read(),mod=read();
        tr.init(1,1,n);
        for(register int i=1;i<=n;++i)
        {
            int opt=read();
            ll x=read();
            if(opt==1)
                tr.update(1,1,n,i,x);
            else
                tr.update(1,1,n,x,1);
            write(tr.mul[1]),puts("");
        }
    }
    return 0;
 } 

原文地址:https://www.cnblogs.com/yzhang-rp-inf/p/10335121.html

时间: 2024-10-04 12:32:14

【题解】Luogu P4588 [TJOI2018]数学计算的相关文章

BZOJ5334:[TJOI2018]数学计算——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=5334 小豆现在有一个数x,初始值为1. 小豆有Q次操作,操作有两种类型: 1 m: x = x  *  m ,输出 x%mod; 2 pos: x = x /  第pos次操作所乘的数(保证第pos次操作一定为类型1,对于每一个类型1 的操作至多会被除一次),输出x%mod 都懒得写题解了……就对着时间建一个线段树,区间维护乘积即可. 真·大水题. #include<cmath> #inclu

bzoj5334: [Tjoi2018]数学计算

这是个悲伤的故事捂脸 噶爷爷安利了到水题,自然而然的被D飞 队长看了一眼说他不会 然而我写T了的时候他过来又看了下说粗略看没啥问题 OZY一眼就说我会nlogn的 结果题意看了20分钟没看懂...高兴的吼了起来tkj:人家都秒了你才看懂题意 哈哈.然而我看懂题意也一眼秒啦.就是线段树把全部记录下来乱搞啊. 结果TLE了.噶爷爷没看出来,就怼怼我线段树模板都错学什么OI啊 l打成1真是没话说..ORZ zory #include<cstdio> #include<iostream>

题解 luogu P1850 【换教室】

题解 luogu P1850 [换教室] 时间:2019.8.6 一晚上(约 3.5h 写完) 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 \(2n\) 节课程安排在 \(n\) 个时间段上.在第 \(i\)(\(1 \leq i \leq n\))个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 \(c_i\) 上课,而另一节课程在教室 \(d_i\) 进行. 在不提交任何申请的情况下,学生们需要

[笔记]shell编程:数学计算

在shell Script中,有好几种进行数学运算的方法,虽然有几个效果差不多,在编写程序的时候使用一种方法就够了,但是我们可能还需要学习别人的程序啊,在阅读别人的程序的时候不能不认识这些东西吧.所以,留个笔记. 一.expr 命令  --  expr 允许在命令行上处理数学表达式,但是略显拙劣. 例:$ expr 1 + 5    #注意在表达式中要有空格,如果写成1+5那么结果就不是我们想要的了. expr命令能够识别一些不同的数学和字符串操作符: 操作符 描述 arg1 | arg2 如果

dx11 入门 Tutorial 04: DX、HLSL中矩阵的内存存储和数学计算方式 DirectXSampleBrowser(June 2010)

主要是两方面: 1.shader数据和dx的通信,使用constant Buffer 2.矩阵的数学计算方式和内存存储方式再DX和HLSL中的异同 先说第一个: dx中的常量数据matrix等传入shader中流程: The first thing that we need to do is declare three constant buffer variables. Constant buffers are used to store data that the application n

理工科应该的知道的C/C++数学计算库(转)

理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件系统的某一个很有限的功能,你是不是也要因此再用一用那动辄几个g的软件呢?其实我觉得如果系统不是很大,不是很复杂,我们个人完全有可能自己去编写代码来实现这些‘’有限的功能‘’.别以为这是件很困难的事情,我总以为大学期间学的c语言是极其有用的,只要你会基本的c语言语法,你就可以的. 下面我来介绍几个非常

bash/shell 数学计算

$ echo $((20.0/7)) $ zcalc $ bc <<< 20+5/2 $ bc <<< 'scale=4;20+5/2' $ expr 20 + 5 $ calc 2 + 4 $ node -pe 20+5/2 # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI $ echo 20 5 2 / + p | dc $ echo 4 k 20 5 2 / + p | dc $ perl -

关于JS数学计算精度不准和自动转科学计数法的问题

在javaScript中,数学计算是一个很坑爹的问题, 由于系统二进制转十进制的误差,导致浮点数的运算精度很不理想,经常会出现一些意想不到的问题. 而js自动将小数转为科学计数法的问题,也让一些自己写数学插件的同学痛苦不已. 第一个,浮点数计算精度: 比如:1.2*3 = 3.599999999.... 解决办法: ⑴将浮点数乘以10的n次幂化为整数,再进行计算,之后再除以10的n次幂,就可以得到我们想要的数值.即:1.2*3 = 12*3/10 = 3.6;(n为小数点后数位之和); 至于多个

[LeetCode] 数学计算模拟类问题:除法和幂,注意越界问题。题 Pow(x, n) ,Divide Two Integers

引言 数学计算的模拟类题目,往往是要求实现某种计算(比如两数相除),实现的过程中会有所限定,比如不允许乘法等等. 这类题目首先要注意计算过程中本身的特殊情况.比如求相除,则必须首先反映过来除数不能为0. 其次要记得考虑负数的情况,如果计算范围不单单是整数,还要考虑double的比较方式. 最后要注意越界情况,这个是最容易犯错的,只能具体问题具体分析. 例题 1 Pow(x, n) Implement pow(x, n). class Solution { public: double pow(d