vijos2051 SDOI2019 快速查询
吐槽
竟然让\(nlog\)的做法卡过去了。。
思路
因为\(1 \le q \le 10^5\),所以可以先对每个标准操作,所操作的位置进行重标号。这样所有的下标都是在\(10^5\)以内的。
乘和加操作都可以写成\(kx+b\)的形式。然后对于这些操作维护一个前缀。然后就可以得到一个区间内的操作了。
区间查询我们只要找个\(TOT\)来维护一下当前的所有元素和,就行了。
单点查询,观察其上次赋值的时间。如果早于集体赋值,那么就输出当前大多数的值。
否则就将其上次赋的值乘上从上次赋值到当前时间点这个时间段内的操作。
代码
/*
* @Author: wxyww
* @Date: 2019-05-07 20:58:04
* @Last Modified time: 2019-05-11 10:33:03
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
using namespace std;
typedef long long ll;
const int N = 100010,mod = 1e7 + 19;
map<int,int>ma;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
struct node {
int opt,pos,val;
}que[N];
int TOT,s[N],a[N],b[N],now,inv[mod + 1],n,T,Q,mul[N * 100],add[N * 100];
int lst[N],LAST;
int query(int x,int num) {
if(lst[x] <= LAST) return now;
int cheng = 1ll * mul[num] * inv[mul[lst[x]]] % mod;
int jia = (add[num] - 1ll * add[lst[x] - 1] * cheng % mod + mod) % mod;
return (1ll * s[x] * cheng % mod + jia) % mod;
}
int ans;
void solve(int x,int num) {
int opt = que[x].opt,pos = que[x].pos,val = que[x].val % mod;
mul[num] = mul[num - 1],add[num] = add[num - 1];
if(opt == 1) {
TOT -= query(pos,num);
TOT += val;
TOT = (TOT % mod + mod) % mod;
lst[pos] = num;
s[pos] = val;
}
else if(opt == 2) {
TOT += (1ll * n * val % mod + mod) % mod;
TOT = (TOT % mod + mod) % mod;
add[num] += val;
add[num] = (add[num] %mod + mod) % mod;
now += val;
now = (now % mod + mod) % mod;
}
else if(opt == 3) {
TOT = (1ll * TOT * val % mod + mod) % mod;
now = (1ll * now * val % mod + mod) % mod;
add[num] = (1ll * add[num] * val % mod + mod) % mod;
mul[num] = (1ll * mul[num] * val % mod + mod) % mod;
}
else if(opt == 4) {
TOT = (1ll * val * n % mod + mod) % mod;
mul[num] = 1;add[num] = 0;
now = val;
LAST = num;
}
else if(opt == 5) ans += query(pos,num),ans = (ans % mod + mod) % mod;
else ans = ((ans + TOT) % mod + mod) % mod;
}
int main() {
n = read(),Q = read();
for(int i = 1;i <= Q;++i) {
int opt = que[i].opt = read();
if(opt == 1) {
que[i].pos = read();que[i].val = read();
}
else if(opt == 6) continue;
else if(opt == 5) que[i].pos = read();
else que[i].val = read();
}
inv[1] = 1;
for(int i = 2;i < mod;++i) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
int js = 0;
for(int i = 1;i <= Q;++i) {
if(!que[i].pos) continue;
if(!ma[que[i].pos]) ma[que[i].pos] = ++js;
que[i].pos = ma[que[i].pos];
}
int T = read(),num = 0;
for(int i = 1;i <= T;++i) a[i] = read(),b[i] = read();
for(int i = 1;i <= T;++i)
for(int j = 1;j <= Q;++j)
solve((a[i] + 1ll * j * b[i] % Q) % Q + 1,++num);
cout<<(ans % mod + mod) % mod;
return 0;
}
vijos2051 SDOI2019 快速查询的更多相关文章
- [SDOI2019]快速查询——模拟
题目链接: [SDOI2019]快速查询 对于整个序列维护一个标记$(k,b)$表示序列的每个数的真实值为$k*a_{i}+b$(注意要实时维护$k$的逆元),并记录序列的和. 对于单点修改,将$a_ ...
- [SDOI2019]快速查询
[SDOI2019]快速查询 [题目链接] 链接 [思路要点] 据说是 \(\text{SDOI2019}\) 最水的题 操作次数为 \(1e7\) 范围,显然要求每次操作 \(\mathcal{O} ...
- luogu P5358 [SDOI2019]快速查询【模拟(?)】
把有单点修改和查询的点离散进一个数组,然后单点修改直接改,记录一个修改时间t,维护一个sm表示这些离散的点的和,val表示出了离散点其他点的值,因为都是一样的所以只记录这一个值即可,记录ljlc为加法 ...
- 【题解】Luogu P5358 [SDOI2019]快速查询
原题传送门 神鱼说这道题是强制离线(smog 我们珂以把被单点修改,单点查询的点单独拿出来处理,把每个数表示成\(mul*x+plus\) 初始状态下\(mul=1,plus=0\) 操作1:在总和中 ...
- 【洛谷5358】[SDOI2019] 快速查询(模拟)
点此看题面 大致题意: 有单点赋值.全局加法.全局乘法.全局赋值.单点求值.全局求和\(6\)种操作.现在给出操作序列,以及\(t\)对正整数\(a_i,b_i\).让你处理\(t*q\)次操作,每次 ...
- SDOI2019快速查询
链接 vijos 思路 虽然询问1e7,但他询问很有意思,所以最多修改1e5个. 先把他们修改的点缩小到1e5之内并没有什么影响. 然后维护mul和add.不修改很好弄,修改的点可以弄点式子加加减减弄 ...
- P5358 [SDOI2019]快速查询
思路:...乱搞数据结构?? 提交:1次 题解: 观察到除了单点就是全局操作,所以我们维护一个全局加法标记add和乘法标记mul和答案sum. 单点修改时,比如我们要把 \(pos\) 位置改成 \( ...
- 快速查询Python脚本语法
/********************************************************************* * 快速查询Python脚本语法 * 说明: * Char ...
- 一种快速查询多点DS18B20温度的方法(转)
源:http://hi.baidu.com/james_xiao/item/79b961c90623093e45941623 一种快速查询多点DS18B20温度的方法 引言 为了满足实时性要 ...
随机推荐
- tomcat参数java_opts调整
启动文件修改 在windows环境下,tomcat下的~/bin/catalina.bat文件,在文件头部加入: set "JAVA_OPTS=%JAVA_OPTS% -server -Xm ...
- torch_11_风格迁移和cycleGAN
1,A Neural Algorithm of atistic Style https://axiv.org/pdf/1508.06576.pdf 如何定义图片的内容,风格: 定义内容:在vggnet ...
- 基于仿射的非刚体配准方法(i) 法向
为啥闲呢,因为work干完了. 为啥补档呢,因为有新work了. 呃,因为新work让人自闭. 我现在干完了两部分.一是把最近邻的部分迁移过来. 二是求法向. 首先是给三个点,就能确定平面——因为是三 ...
- hive on spark 释放session资源
背景 启动hive时,可以看到2.0以后的版本,将要弃用mr引擎,官方建议使用spark,tez等引擎. spark同时支持批式流式处理,可以减少学习成本.所以选用了spark作为执行引擎. hive ...
- iframe嵌套页面中的跳转
简单说一下场景. 假设有A.B.C和D四个JSP页面,D通过iframe嵌套在C中,C通过iframe嵌套在B中,B通过iframe嵌套在A中. 然后现在在D中编写JavaScript代码跳转页面. ...
- 读书会荐书 - 关于Ada Lovelacer的书
今天很感谢Weny组织了这期读书会, 我受益良多. 会上我推荐了<中的精神>, 但是会后想起有更好的书. 就是关于Ada Lovelace的书. 先简单介绍一下Ada Lovelacer. ...
- ubuntu 换源 aliyun
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list sudo sed -i 's/securit ...
- Java学习——BigInteger类和BigDecimal类
Java学习——BigInteger类和BigDecimal类 摘要:本文主要学习了用于大数字运算的BigInteger类和BigDecimal类. 部分内容来自以下博客: https://www.c ...
- apache-tomcat-7.0.94在Windows上启动时,控制台黑窗口出现乱码解决
一.问题 二.解决 原因是tomcat日志编码的配置问题. 打开tomcat/conf/logging.properties配置文件. 把编码注释掉或者改为gbk就可以了. 参考:https://bl ...
- DDL创建数据库,表以及约束(极客时间学习笔记)
DDL DDL是DBMS的核心组件,是SQL的重要组成部分. DDL的正确性和稳定性是整个SQL发型的重要基础. DDL的基础语法及设计工具 DDL的英文是Data Definition Langua ...