链接

vijos

思路

虽然询问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快速查询的更多相关文章

  1. [SDOI2019]快速查询——模拟

    题目链接: [SDOI2019]快速查询 对于整个序列维护一个标记$(k,b)$表示序列的每个数的真实值为$k*a_{i}+b$(注意要实时维护$k$的逆元),并记录序列的和. 对于单点修改,将$a_ ...

  2. [SDOI2019]快速查询

    [SDOI2019]快速查询 [题目链接] 链接 [思路要点] 据说是 \(\text{SDOI2019}\) 最水的题 操作次数为 \(1e7\) 范围,显然要求每次操作 \(\mathcal{O} ...

  3. luogu P5358 [SDOI2019]快速查询【模拟(?)】

    把有单点修改和查询的点离散进一个数组,然后单点修改直接改,记录一个修改时间t,维护一个sm表示这些离散的点的和,val表示出了离散点其他点的值,因为都是一样的所以只记录这一个值即可,记录ljlc为加法 ...

  4. vijos2051 SDOI2019 快速查询

    题目链接 吐槽 竟然让\(nlog\)的做法卡过去了.. 思路 因为\(1 \le q \le 10^5\),所以可以先对每个标准操作,所操作的位置进行重标号.这样所有的下标都是在\(10^5\)以内 ...

  5. 【题解】Luogu P5358 [SDOI2019]快速查询

    原题传送门 神鱼说这道题是强制离线(smog 我们珂以把被单点修改,单点查询的点单独拿出来处理,把每个数表示成\(mul*x+plus\) 初始状态下\(mul=1,plus=0\) 操作1:在总和中 ...

  6. 【洛谷5358】[SDOI2019] 快速查询(模拟)

    点此看题面 大致题意: 有单点赋值.全局加法.全局乘法.全局赋值.单点求值.全局求和\(6\)种操作.现在给出操作序列,以及\(t\)对正整数\(a_i,b_i\).让你处理\(t*q\)次操作,每次 ...

  7. P5358 [SDOI2019]快速查询

    思路:...乱搞数据结构?? 提交:1次 题解: 观察到除了单点就是全局操作,所以我们维护一个全局加法标记add和乘法标记mul和答案sum. 单点修改时,比如我们要把 \(pos\) 位置改成 \( ...

  8. 快速查询Python脚本语法

    /********************************************************************* * 快速查询Python脚本语法 * 说明: * Char ...

  9. 一种快速查询多点DS18B20温度的方法(转)

    源:http://hi.baidu.com/james_xiao/item/79b961c90623093e45941623 一种快速查询多点DS18B20温度的方法 引言      为了满足实时性要 ...

随机推荐

  1. k8s-架构中各个组件介绍

    参考链接:https://github.com/opsnull/follow-me-install-kubernetes-cluster kubernetes 概述 1.kubernetes 是什么 ...

  2. WebAPI中路由参数中包含字符-点“.”

    请求url都是类似:/api/area/province.list 我们默认建立的Asp Net WebApi 服务时,如果请求url包含“.”,则返回404错误. 解决办法:需要在web.confi ...

  3. js根据json数组多个字段排序

    /**数组根据数组对象中的某个属性值进行排序的方法 * 使用例子:newArray.sort(sortByArr(['number'],false)) //表示根据number属性降序排列;若第二个参 ...

  4. JavaScript 数组(三)数组方法

    常用方法及案例参考这篇:数组对象及常用方法

  5. ES6的新特性

    ECMAScript 6(简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,又称ECMAScript 2015.ES6就是ES2015. 虽然目前并不是所有 ...

  6. 模块化规范:CMD和AMD的区别

    https://www.zhihu.com/question/20351507/answer/14859415 AMD(异步模块定义) 是 RequireJS 在推广过程中对模块定义的规范化产出.CM ...

  7. 英语fieldyellowstone田黄石fieldyellowstone单词

    田黄石(Field yellow stone),简称“田黄”,产于福州市寿山乡“寿山溪”两旁之水稻田底下.呈黄色而得名.寿山石优良品种.狭义的田黄石指“田坑石”,广义的田黄石是指其化学成分相同的一类印 ...

  8. Android源码分析(五)-----如何从架构师的角度去设计Framework框架

    一 : 架构与程序 软件架构是一种思维方式,而程序只是实现思维方式的一种手段,代码固然重要,但是若没有整体的思维架构,一切程序都如水中浮萍. 二 : 框架如何设计 暂时抛开Android Framew ...

  9. Request和Response。

    复习点:1.重定向问题  2.输出字符串到浏览器.3.文件下载需求:1. 页面显示超链接2. 点击超链接后弹出下载提示框3. 完成图片文件下载 Request和Response Request: 1. ...

  10. Linux安装在虚拟机上

    虚拟机上安装centos7 minimal 详细操作链接:https://blog.csdn.net/babyxue/article/details/80970526 镜像文件 xxx.iso 本质就 ...