bzoj 5334 数学计算
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 数学计算的更多相关文章
- 【线段树】BZOJ 5334 数学计算
题目内容 小豆现在有一个数\(x\),初始值为\(1\).小豆有\(Q\)次操作,操作有两种类型: 1 m:\(x=x×m\),输出\(x\ mod\ M\): 2 pos:\(x=x/\)第\(po ...
- BZOJ 5334--[Tjoi2018]数学计算(线段树)
5334: [Tjoi2018]数学计算 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 220 Solved: 147[Submit][Status ...
- 【BZOJ5334】数学计算(线段树)
[BZOJ5334]数学计算(线段树) 题面 BZOJ 洛谷 题解 简单的线段树模板题??? 咕咕咕. #include<iostream> #include<cstdio> ...
- BZOJ5334: [Tjoi2018]数学计算
BZOJ5334: [Tjoi2018]数学计算 https://lydsy.com/JudgeOnline/problem.php?id=5334 分析: 线段树按时间分治即可. 代码: #incl ...
- [Tjoi2018]数学计算
[Tjoi2018]数学计算 BZOJ luogu 线段树分治 是不是想问为什么不暴力做? 模数没说是质数,所以不一定有逆元. 然后就是要每次build一下把线段树权值init成1, 博猪不知道为什么 ...
- 理工科应该的知道的C/C++数学计算库(转)
理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件 ...
- Shell之数学计算
本博客已经迁往http://www.kemaswill.com/, 博客园这边也会继续更新, 欢迎关注~ 数学计算是Shell中比较常用的一种操作, 但是因为shell中所有的变量都默认为字符串, ...
- Shell脚本笔记(三)shell中的数学计算
shell中的数学计算 一.使用方括号 #!/bin/bash a= b= c= res=$[$a * ($c-$b)] echo $res 二.使用(()) +)) ((i=+)) b=$((-*) ...
- C语言中几个常用数学计算函数ceil(), floor(), round()的用法
最近在实现算法的过程中,遇到了使用几个数学计算函数,感觉挺有意思,就记下来 方便以后使用. ceil(x)返回不小于x的最小整数值(然后转换为double型). floor(x)返回不大于x的最大整数 ...
随机推荐
- log4j和logback
Log4j和logback Log4j简介 Log4j(log for java) 1.是Apache的一个开源项目: 2.是使用Java语言编写的一个日志框架: 3.用于记录程序中的日志信息: 4. ...
- Java并发之synchronized深入
一句话总结synchronized: JVM会自动通过使用monitor来加锁和解锁,保证了同时只有一个线程可以执行指定代码,从而保证了线程安全,同时具有可重入和不可中断的性质. 一.synchron ...
- 【Python】更优的字符串格式化方式 -- "format"替代"%s"
背景 前段时间看了一篇介绍Python的代码技巧的文章,建议格式化字符串时使用"format"代替使用"%",但是没有说明原因.各博客网站介绍相关用法的博客很多 ...
- java:历史回顾
1.String和StringBuffer区别 2.Runtime和System类,包括对象垃圾收集 Rumtime.gc() System.gc() 调用的其实就是Runtime的gc回收 3.da ...
- String C++完整实现。
String C++实现 改进: /* 版权信息:狼 文件名称:String.h 文件标识: 摘 要:对于上版本简易的String进行优化跟进. 改进 1.(将小块内存问题与大块分别对待)小内存块每个 ...
- poj1228稳定凸包
就是给一系列点,看这是不是一个稳定凸包 稳定凸包是指一个凸包不能通过加点来使它扩大面积,也就是说每条边最少有三个点 判断的地方写错了,写了两边循环,其实数组s已经排好了序,直接每三个判断就好了 #in ...
- poj 1724 ROADS 很水的dfs
题意:给你N个城市和M条路和K块钱,每条路有话费,问你从1走到N的在K块钱内所能走的最短距离是多少 链接:http://poj.org/problem?id=1724 直接dfs搜一遍就是 代码: # ...
- day28 CRM万能权限组件开发 && 主机管理-堡垒机
1,CRM项目实战-万能权限组件开发参考博客:http://www.cnblogs.com/alex3714/articles/6661911.html 参考代码:https://github.com ...
- python进行linux系统监控
python进行linux系统监控 Linux系统下: 静态指标信息: 名称 描述 单位 所在文件 mem_total 内存总容量 KB /proc/meminfo disks 磁盘相关信息 - ...
- day6-面向对象补充篇--类的特殊成员
先说明一下,今天的内容主要转自师兄张其高的博客http://www.cnblogs.com/zhangqigao/articles/6935221.html 前面我们讲了类的方法,有普通方法,就是我们 ...