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温度的方法 引言 为了满足实时性要 ...
随机推荐
- - Permission 运行时权限 总结 翻译 MD
目录 目录 对运行时权限的一些理解 运行时权限使用案例 开源库:PermissionsDispatcher 注解 使用案例 使用步骤 测试代码 自动生成的类 官方文档:请求权限 Add permiss ...
- easyui-datagrid 加载数据 的两种方法
var start_date_entered=$('#start_date_entered').val(); //创建时间 var stop_date_entered=$('#stop_date_en ...
- 整理:C#中Expression表达式的妙用
原文:整理:C#中Expression表达式的妙用 一.目的:通过示例了解C#中Expression表达式的作用,通过表达式和反射可以写出很优雅的代码和架构,也可以完成一些看似不可能完成的任务 二.示 ...
- MAC电脑下Appium + python3 + robotframework ios的真机测试环境搭建
本人的环境搭建前的准备,MAC电脑一台(macOS Mojave 10.14.0及以上),Xcode 10.0及以上 ,自己注册的一个Apple ID 账户,必须你的电脑能连接互联网,最好不要用公 ...
- 手写Ajax的意义所在,从青铜到钻石!
话说菩提祖师打了孙猴子三板子 然后悟空学会72般变化以及一身神通 对待这个问题作为面试者要思考更加深层次的意义 才更能获得认可 实际上写的ajax 很能看出一个的水平 贴几段代码就可以看出水平的高低 ...
- Django:RestFramework之-------版本控制
6.版本控制 从URL通过get传参获取版本. 6.1自定义版本控制 from rest_framework.views import APIView class ParamVersion(objec ...
- 使用JDBC,完成数据库批量添加数据操作:
第一步:定义一个key String key = "into 表名(字段1,字段2,字段3)"; 第二步:定义一个可以增长的变量 StringBuffer values = new ...
- 关于连接不上SVN的部分解决方案——No repository found in svn localhost
今天如往常一样做事,期间发现一个问题,于是就打算将文件与 svn 上的文件进行对比,可谁成想 Eclipse 突然弹框报错,然后我到SVN资源库中直接刷新打开 svn 的地址,又弹框报错:文件夹不存在 ...
- Gzip模块
Gzip模块为python的压缩和解压缩模块,读写gzip 文件 一.使用gzip模块压缩文件: 1 import gzip #导入python gzip模块,注意名字为全小写 2 g = gzip. ...
- Go基本运行编译命令解释
go run命令: 直接执行命令源码文件:一定要声明自己是在main包下,要是只有一个工作区,相应的文件就会存在bin文件下 go build: 把文件夹下的命令源码文件编译成直接运行文件,但是不能有 ...