看似数学题实则数据结构(线段树)——数学计算
小豆现在有一个数x,初始值为1. 小豆有Q次操作,操作有两种类型:
1 m: x = x * m ,输出 x%mod;
2 pos: x = x / 第pos次操作所乘的数(保证第pos次操作一定为类型1,对于每一个类型1 的操作至多会被除一次),输出x%mod
一共有t组输入(t ≤ 5)
对于每一组输入,第一行是两个数字Q, mod(Q ≤ 100000, mod ≤ 1000000000);
接下来Q行,每一行为操作类型op,操作编号或所乘的数字m(保证所有的输入都是合法的).
1 ≤ Q ≤ 100000
———————————————
——————————
如何解决:
考虑用线段树,操作一就在操作的位置插入m,操作二就是把第pos位贡献变为1,这样求区间乘积就可以了
——————————————————————————————————
——————————————
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define ll long long
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
const int maxn=200005;
int treee[maxn<<2],mod;
int read(){
int x=0,v=1; char ch=getchar();
for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());
for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());
return x*v;
}
void modify(int now,int tl,int tr,int x,int v){
if (tl==tr) return (void) (treee[now]=v);
int mid=(tl+tr)>>1;
if (x<=mid) modify(now<<1,tl,mid,x,v);
else modify(now<<1|1,mid+1,tr,x,v);
treee[now]=1LL*treee[now<<1]*treee[now<<1|1]%mod;
}
int query(int now,int tl,int tr,int l,int r) {
if (r<l) return 1;
if (tl>=l&&tr<=r) return treee[now];
int mid=(tl+tr)>>1;
int qx=query(now<<1,tl,mid,l,std:: min(r,mid));
int qy=query(now<<1|1,mid+1,tr,std:: max(mid+1,l),r);
return 1LL*qx*qy%mod;
}
void build(int now,int tl,int tr) {
treee[now]=1;
if (tl==tr) return ;
int mid=(tl+tr)>>1;
build(now<<1,tl,mid);
build(now<<1|1,mid+1,tr);
}
int main(){
//freopen("a.in","r",stdin);
for (int T=read();T--;) {
int n=read(); mod=read();
build(1,1,n);
rep(i,1,n){
int opt=read(),x=read();
if(opt==1)modify(1,1,n,i,x);
else modify(1,1,n,x,1);
printf("%d\n", treee[1]);
}
}
return 0;
}
代码:
#include <stdio.h> #include <string.h> #include <algorithm> #define ll long long #define rep(i,st,ed) for (int i=st;i<=ed;++i) const int maxn=200005; int treee[maxn<<2],mod; int read(){ int x=0,v=1; char ch=getchar(); for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar()); for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar()); return x*v; } void modify(int now,int tl,int tr,int x,int v){ if (tl==tr) return (void) (treee[now]=v); int mid=(tl+tr)>>1; if (x<=mid) modify(now<<1,tl,mid,x,v); else modify(now<<1|1,mid+1,tr,x,v); treee[now]=1LL*treee[now<<1]*treee[now<<1|1]%mod; } int query(int now,int tl,int tr,int l,int r) { if (r<l) return 1; if (tl>=l&&tr<=r) return treee[now]; int mid=(tl+tr)>>1; int qx=query(now<<1,tl,mid,l,std:: min(r,mid)); int qy=query(now<<1|1,mid+1,tr,std:: max(mid+1,l),r); return 1LL*qx*qy%mod; } void build(int now,int tl,int tr) { treee[now]=1; if (tl==tr) return ; int mid=(tl+tr)>>1; build(now<<1,tl,mid); build(now<<1|1,mid+1,tr); } int main(){ //freopen("a.in","r",stdin); for (int T=read();T--;) { int n=read(); mod=read(); build(1,1,n); rep(i,1,n){ int opt=read(),x=read(); if(opt==1)modify(1,1,n,i,x); else modify(1,1,n,x,1); printf("%d\n", treee[1]); } } return 0; }
原文地址:https://www.cnblogs.com/DZN2004/p/12980014.html
- ModernPHP读书笔记(二) ——PHP开发标准
- iBatis.Net(6):Data Map(深入)
- iBatis.Net(5):Data Map(了解)
- ModernPHP读书笔记(三)——PHP的良好实践
- PHP开发过程的那些坑(一) ——对象拷贝
- PHP开发过程的那些坑(二) ——PHP empty函数
- Thinking in SQL系列之数据挖掘Apriori关联分析再现啤酒尿布神话
- PHP开发过程的那些坑(三) ——PHParray_shift函数
- CSS3弹性盒布局
- iBatis.Net(4):DataMapper API
- PHP开发过程的那些坑(四) ——PDO bindParam函数
- iBatis.Net(3):创建SqlMapper实例
- PHP开发过程的那些坑(五) ——PHP的empty()
- iBatis.Net(2):基本概念与配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法