SDOI2019快速查询
链接
思路
虽然询问1e7,但他询问很有意思,所以最多修改1e5个。
先把他们修改的点缩小到1e5之内并没有什么影响。
然后维护mul和add。不修改很好弄,修改的点可以弄点式子加加减减弄出来,逆元线性推也是可以的。
总的复杂度\(O(qlogq+tq+mod)\)
总结
我考场上连\(O(n^3)\)都写不对,回来不到一个小时就A了?浮躁!
其实已经写了三遍了、、码力急需加强
代码
#include <bits/stdc++.h>
#define debug(x) cerr << x << " "
using namespace std;
const int N = 1e5 + 7, mod = 1e7 + 19;
int read() {
int x = 0, f = 1; char s = getchar();
for (; s > '9' || s < '0'; s = getchar()) if(s == '-') f = -1;
for (; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
return x * f;
}
int n, q, t, a[107], b[107];
struct QUERY {
int opt, id, val;
} Q[N];
map<int, int> Hash;
int lsh_cnt, inv[N*100], stak[N], top;
struct node {
int val, add, mul;
node() {val = -1, add = 0,mul = 1;}
void clear() {val = -1, add = 0, mul = 1;}
} las[N];
int main() {
// freopen("data.in", "r", stdin);
n = read(), q = read();
for (int i = 1; i <= q; ++i) {
Q[i].opt = read();
if (Q[i].opt == 1) Q[i].id = read(), Q[i].val = read();
if (Q[i].opt == 2 || Q[i].opt == 3 || Q[i].opt == 4) Q[i].val = read();
if (Q[i].opt == 5) Q[i].id = read();
if (Q[i].id && !Hash.count(Q[i].id)) Hash[Q[i].id] = ++lsh_cnt;
while (Q[i].val < 0) Q[i].val += mod;
Q[i].val %= mod;
}
for (int i = 1; i <= q; ++i)
if (Q[i].opt == 1 || Q[i].opt == 5)
Q[i].id = Hash[Q[i].id];
inv[1] = 1;
for (int i = 2; i < mod; ++i)
inv[i] = 1LL * (mod - mod / i) * inv[mod % i] % mod;
t = read();
for (int i = 1; i <= t; ++i) a[i] = read(), b[i] = read();
// cerr << "read is ok\n";
int ans = 0, tot = 0, add = 0, mul = 1, init = 0;
for (int i = 1; i <= t; ++i) {
for (int j = 1; j <= q; ++j) {
int x = (a[i] + 1LL * j * b[i]) % q + 1;
// cout<<x<<"\n";
// debug(Q[x].opt),debug(Q[x].id),debug(Q[x].val);cerr<<"\n";
if (Q[x].opt == 1) {
if (las[Q[x].id].val == -1) {
tot = ((tot - (1LL * init * mul % mod + add) % mod) %mod + mod) % mod;
stak[++top] = Q[x].id;
} else {
int now_mul = 1LL * mul * inv[las[Q[x].id].mul] % mod;
int now_add = ((add - 1LL * las[Q[x].id].add * now_mul % mod) % mod + mod) % mod;
tot = ((tot - (1LL * las[Q[x].id].val * now_mul % mod + now_add) % mod) % mod + mod) % mod;
}
tot = (tot + Q[x].val) % mod;
las[Q[x].id].val = Q[x].val;
las[Q[x].id].add = add;
las[Q[x].id].mul = mul;
}
if (Q[x].opt == 2) {
add = (add + Q[x].val) % mod;
tot = (tot + 1LL * Q[x].val * n % mod) % mod;
}
if (Q[x].opt == 3) {
add = 1LL * add * Q[x].val % mod;
mul = 1LL * mul * Q[x].val % mod;
tot = 1LL * tot * Q[x].val % mod;
}
if (Q[x].opt == 4) {
while (top) las[stak[top--]].clear();
init = Q[x].val, add = 0, mul = 1;
tot = 1LL * Q[x].val * n % mod;
}
if (Q[x].opt == 5) {
if (las[Q[x].id].val == -1) {
ans = ((ans + (1LL * init * mul % mod + add) % mod) %mod + mod) % mod;
} else {
int now_mul = 1LL * mul * inv[las[Q[x].id].mul] % mod;
int now_add = ((add - 1LL * las[Q[x].id].add * now_mul % mod) % mod + mod) % mod;
ans = ((ans + (1LL * las[Q[x].id].val * now_mul % mod + now_add) % mod) % mod + mod) % mod;
}
}
if (Q[x].opt == 6) ans = (ans + tot) % mod;
}
}
printf("%lld\n", ans);
return 0;
}
/*
5 5
6
6
3 4
1 3 8
5 5
1
8062 15996
*/
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为加法 ...
- vijos2051 SDOI2019 快速查询
题目链接 吐槽 竟然让\(nlog\)的做法卡过去了.. 思路 因为\(1 \le q \le 10^5\),所以可以先对每个标准操作,所操作的位置进行重标号.这样所有的下标都是在\(10^5\)以内 ...
- 【题解】Luogu P5358 [SDOI2019]快速查询
原题传送门 神鱼说这道题是强制离线(smog 我们珂以把被单点修改,单点查询的点单独拿出来处理,把每个数表示成\(mul*x+plus\) 初始状态下\(mul=1,plus=0\) 操作1:在总和中 ...
- 【洛谷5358】[SDOI2019] 快速查询(模拟)
点此看题面 大致题意: 有单点赋值.全局加法.全局乘法.全局赋值.单点求值.全局求和\(6\)种操作.现在给出操作序列,以及\(t\)对正整数\(a_i,b_i\).让你处理\(t*q\)次操作,每次 ...
- P5358 [SDOI2019]快速查询
思路:...乱搞数据结构?? 提交:1次 题解: 观察到除了单点就是全局操作,所以我们维护一个全局加法标记add和乘法标记mul和答案sum. 单点修改时,比如我们要把 \(pos\) 位置改成 \( ...
- 快速查询Python脚本语法
/********************************************************************* * 快速查询Python脚本语法 * 说明: * Char ...
- 一种快速查询多点DS18B20温度的方法(转)
源:http://hi.baidu.com/james_xiao/item/79b961c90623093e45941623 一种快速查询多点DS18B20温度的方法 引言 为了满足实时性要 ...
随机推荐
- 【mysql】 mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件 【mybatis】count 统计+JSON查询
mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件+count 需求: ======================================= ...
- 程序员不装x能行?先给登录来一个图形验证码!(canvas实现)
细心的同学可以发现,现在很多网站当登录多次之后就会出现一个图形验证码,或是当提交表单.或点击获取手机验证码等等场景都会有图形验证码的出现. 那么图形验证码是为了解决什么问题而出现的呢? 什么是图形验证 ...
- 《MySQL实战45讲》学习笔记1——MySQL的基础架构
在<极客时间>订阅了<MySQL实战45讲>专栏,总觉得看完和没看一样
- java基础 接口静态方法
/** * 从java8开始,接口当中允许定义静态方法 * 格式: * public static 返回值类型 方法名称(参数列表){ * 方法体 * } * 提示:就是将abstract或者defa ...
- CXF 教程(一)
CXF Web Service 简单示例 1 准备工作 2 第一个例子 3 客户端 3.1 使用 WSDL 生成客户端 4 RPC 风格 5 相关命令介绍 5.1 Java to WS 1 准备工作 ...
- jQuery---jq操作标签文本(html(),text()),jq操作文档标签(插入,删除,修改),克隆,,jq操作属性,jq操作class属性,jq操作表单value,jq操作css,jq操作盒子(重要),jq操作滚动条
jQuery---jq操作标签文本(html(),text()),jq操作文档标签(插入,删除,修改),克隆,,jq操作属性,jq操作class属性,jq操作表单value,jq操作css,jq操作盒 ...
- 换个语言学一下 Golang (11)——使用包和测试
Go天生就是为了支持良好的项目管理体验而设计的. 包 在软件工程的实践中,我们会遇到很多功能重复的代码,比如去除字符串首尾的空格.高质量软件产品的特点就是它的部分代码是可以重用的,比如你不必每次写个函 ...
- requestAnimationFrame ---- 请求动画帧。
window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画.该方法需要传入一个回调函数作为参数,该回调函数会 ...
- 从 Vue 的视角学 React(一)—— 项目搭建
虽然 Vue 在国内一家独大,但在全球范围内,React 依然是最流行的前端框架 最近和一些朋友聊天,发现很多项目都选择了 React 技术栈,而且公司的新项目也决定使用 React 我一直以来都是走 ...
- JavaScript 之 对话框
一.alert() 语法格式: alert("hello javascript"); 该对话框是弹出一个提示信息. Chrome 浏览器的效果. 二.prompt() 语法格式: ...