bzoj 5334 数学计算

  • 开始想直接模拟过程做,但模数 \(M\) 不一定为质数,若没有逆元就 \(fAKe\) 掉了.
  • 注意到操作 \(2\) 是删除对应的操作 \(1\) ,相当于只有 \(1\) 操作,但每个操作有一个生效的时限.
  • 将所有操作离线下来,用一颗线段树维护每个时间的答案.对于操作 \(1\) ,预处理出生效的时限后,区间修改那一段即可.注意有没有删除的情况,右端点设为 \(Q\) .
  • 预处理结束后,对每个操作可以一边改一边做,后面的操作显然不会对这里的答案造成影响.
  • 时间复杂度为 \(O(QlogQ)\) .

原来这东西是叫线段树分治.之前我就叫做是离线后线段树上乱搞...

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
inline int read()
{
int out=0,sgn=1;
char jp=getchar();
while(jp!='-' && (jp<'0' || jp>'9'))
jp=getchar();
if(jp=='-')
sgn=-1,jp=getchar();
while(jp>='0' && jp<='9')
out=out*10+jp-'0',jp=getchar();
return out*sgn;
}
const int MAXN=1e5+10;
int Q,P;
inline int mul(int a,int b)
{
return 1LL * a * b % P;
}
int fpow(int a,int b)
{
int res=1;
while(b)
{
if(b&1)
res=mul(res,a);
a=mul(a,a);
b>>=1;
}
return res%P;
}
struct query{
int op,m,r;
}q[MAXN];
namespace SEG{
struct node{
int l,r;
int prod,tag;
}Tree[MAXN<<2];
#define root Tree[o]
#define lson Tree[o<<1]
#define rson Tree[o<<1|1]
void BuildTree(int o,int l,int r)
{
root.l=l,root.r=r;
root.prod=1,root.tag=1;
if(l==r)
return;
int mid=(l+r)>>1;
BuildTree(o<<1,l,mid);
BuildTree(o<<1|1,mid+1,r);
}
void Modifiy(int o,int v)
{
root.prod=mul(root.prod,v);
root.tag=mul(root.tag,v);
}
void pushdown(int o)
{
if(root.tag!=1)
{
Modifiy(o<<1,root.tag);
Modifiy(o<<1|1,root.tag);
root.tag=1;
}
}
void update(int o,int L,int R,int v)
{
int l=root.l,r=root.r;
if(l>R || L>r)
return;
if(L<=l && r<=R)
{
Modifiy(o,v);
return;
}
pushdown(o);
update(o<<1,L,R,v);
update(o<<1|1,L,R,v);
}
int query(int o,int pos)
{
int l=root.l,r=root.r;
if(l==r)
return root.prod;
if(pos<l || pos>r)
return 1;
int mid=(l+r)>>1;
pushdown(o);
if(pos<=mid)
return query(o<<1,pos);
else
return query(o<<1|1,pos);
}
}
int main()
{
int T=read();
while(T--)
{
Q=read(),P=read();
for(int i=1;i<=Q;++i)
{
int op=read();
q[i].op=op;
if(op==1)
q[i].m=read(),q[i].r=Q+1;
else
{
int pos=read();
q[pos].r=i;
}
}
SEG::BuildTree(1,1,Q);
for(int i=1;i<=Q;++i)
{
if(q[i].op==1)
{
int l=i,r=q[i].r;
SEG::update(1,l,r-1,q[i].m);
int ans=SEG::query(1,l);
printf("%d\n",ans);
}
else
{
int ans=SEG::query(1,i);
printf("%d\n",ans);
}
}
}
return 0;
}

bzoj 5334 数学计算的更多相关文章

  1. 【线段树】BZOJ 5334 数学计算

    题目内容 小豆现在有一个数\(x\),初始值为\(1\).小豆有\(Q\)次操作,操作有两种类型: 1 m:\(x=x×m\),输出\(x\ mod\ M\): 2 pos:\(x=x/\)第\(po ...

  2. BZOJ 5334--[Tjoi2018]数学计算(线段树)

    5334: [Tjoi2018]数学计算 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 220  Solved: 147[Submit][Status ...

  3. 【BZOJ5334】数学计算(线段树)

    [BZOJ5334]数学计算(线段树) 题面 BZOJ 洛谷 题解 简单的线段树模板题??? 咕咕咕. #include<iostream> #include<cstdio> ...

  4. BZOJ5334: [Tjoi2018]数学计算

    BZOJ5334: [Tjoi2018]数学计算 https://lydsy.com/JudgeOnline/problem.php?id=5334 分析: 线段树按时间分治即可. 代码: #incl ...

  5. [Tjoi2018]数学计算

    [Tjoi2018]数学计算 BZOJ luogu 线段树分治 是不是想问为什么不暴力做? 模数没说是质数,所以不一定有逆元. 然后就是要每次build一下把线段树权值init成1, 博猪不知道为什么 ...

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

    理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件 ...

  7. Shell之数学计算

    本博客已经迁往http://www.kemaswill.com/, 博客园这边也会继续更新, 欢迎关注~ 数学计算是Shell中比较常用的一种操作,  但是因为shell中所有的变量都默认为字符串, ...

  8. Shell脚本笔记(三)shell中的数学计算

    shell中的数学计算 一.使用方括号 #!/bin/bash a= b= c= res=$[$a * ($c-$b)] echo $res 二.使用(()) +)) ((i=+)) b=$((-*) ...

  9. C语言中几个常用数学计算函数ceil(), floor(), round()的用法

    最近在实现算法的过程中,遇到了使用几个数学计算函数,感觉挺有意思,就记下来 方便以后使用. ceil(x)返回不小于x的最小整数值(然后转换为double型). floor(x)返回不大于x的最大整数 ...

随机推荐

  1. Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused (Connection refused)

    一.linux中配置redis,使用java连接测试时报错: Exception in thread "main" redis.clients.jedis.exceptions.J ...

  2. mac配置jenkins遇到的问题及解决办法

    写这篇博客的时候,我暂时放弃了mac配置jenkins,先记着遇到的坑吧.虽然无数次想砸电脑,但是回头想想,对于经常用windows系统和接触过linux的测试的我来说,这也是个熟悉mac系统的机会. ...

  3. ubuntu16.04 安装以及要做的事情

    1.安装ubuntu 选择安装时更新,以及MP3.图形等:然后选择分区(ext4)(安装时需先进入虚拟系统连上网,输入清华net账号),分区情况按照下图来,swap为临时用的内存分区,可以不要: 选择 ...

  4. django实现图片上传后自动修改尺寸并保存修改后的图到数据库和本地文件系统

    图片上传首先要是设置settings.py文件(与静态文件设置类似) MEDIA_ROOT = os.path.join(BASE_DIR,'media')MEDIA_URL = '/media/' ...

  5. 一个不错的JavaScript解析浏览器路径方法

    JavaScript中有时需要用到当前的请求路径等涉及到url的情况,正常情况下我们可以使用location对象来获取我们需要的信息,本文从另外一个途径来解决这个问题,而且更加巧妙 方法如下: fun ...

  6. HDU - 5988The 2016 ACM-ICPC Asia Qingdao Regional ContestG - Coding Contest 最小费用流

    很巧妙的建边方式 题意:有n个区域,每个区域有一些人数si和食物bi,区域之间有m条定向路径,每条路径有人数通过上限ci.路径之间铺了电线,每当有人通过路径时有pi的概率会触碰到电线,但是第一个通过的 ...

  7. torch7框架 深度学习(1)

    前面已经安装好了torch,下面就来看看如何在torch框架上搭建深度学习模型,我一直觉得源码结合原理是机器学习最好的学习途径.所以我们从分析一个简单的案例开始吧. 参考Supervised Lear ...

  8. sql 多个字段分组,删除重复记录,保留ID最小的一条

    IF OBJECT_ID('cardDetail') IS NOT NULL DROP TABLE cardDetail CREATE TABLE cardDetail ( id ,) PRIMARY ...

  9. neutron源码分析(一)OpenStack环境搭建

    一.OpenStack安装 安装一个初始化的Mitaka版本的OpenStack环境用于分析,neutron源码 序号 角色 IP地址 版本 1 controller 172.16.15.161 mi ...

  10. QuerySetAPI笔记

    学习Django时做的笔记MarkDown文件点这里 # 模型.objects:这个对象是`django.db.models.manager.Manager`的对象,这个类是一个空壳类,他上面的所有方 ...