题目链接

吐槽

竟然让\(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 快速查询的更多相关文章

  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. 【题解】Luogu P5358 [SDOI2019]快速查询

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

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

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

  6. SDOI2019快速查询

    链接 vijos 思路 虽然询问1e7,但他询问很有意思,所以最多修改1e5个. 先把他们修改的点缩小到1e5之内并没有什么影响. 然后维护mul和add.不修改很好弄,修改的点可以弄点式子加加减减弄 ...

  7. P5358 [SDOI2019]快速查询

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

  8. 快速查询Python脚本语法

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

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

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

随机推荐

  1. JavaScript对象及初识面向对象

    一.对象 1.1对象是什么 对象是包含相关属性和方法的集合体 1.2什么是面向对象 面向对象仅仅是一个概念或者编程思想 通过一种叫做原型的方式来实现面向对象编程 二.创建对象 2.1自定义对象 2.1 ...

  2. LeetCode 328:奇偶链表 Odd Even Linked List

    ​给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂度应为 O(1), ...

  3. centos7 更换为aliyun的yum源

    rm -f /etc/yum.repos.d/* wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Ce ...

  4. python每日学习2018/1/14(python之禅)

    The Zen of Python, by Tim Peters   Beautiful is better than ugly. Explicit is better than implicit. ...

  5. 使用Node.js时如何引入jQuery

    使用Node.js时如何引入jQuery 首先安装jQuery依赖 npm install jquery 然后安装jsdom npm install jsdom 引入jQuery 新版正确的依赖方式 ...

  6. 练手WPF(四)——贪吃蛇小游戏的简易实现(下)

    八.生成新的单节蛇身我们这里先说说游戏小原理好了,游戏运行后,通过计时器事件不断生成新的单节蛇身类SnakeNode,添加到List中的0位置,原来的蛇头变成了第二节.该节新蛇头的坐标通过蛇头前进方向 ...

  7. 十三道Python练习题

    一.完美立方 编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a^3= b^3 + c^3 + d^3,其中a,b,c,d 大于 1, 小于等于N. 输入 ...

  8. 想入门Web安全,这些基础知识都学会了吗?

    毕业季已经正式告一段落,这届毕业生都找到心仪的工作了吗? 正在实习期或者试用期的职场新人,是否在岗位上做的风生水起? 工作了一两年,从未升职加薪的菜鸟,还愿意继续原地踏步吗? 在校学生.IT从业者.毕 ...

  9. Github使用教程图文详解

    最近几天发现有些人对Github网站很好奇,但是无奈自己不会用,因为是外国人的网站,首先自己的英文就不过关.对于这个,其实可以用谷歌浏览器去浏览Github,它有一键翻译的功能.但还是有必要介绍一下关 ...

  10. 第七篇Scrum冲刺博客

    第七篇Scrum冲刺博客 一.站立式会议 提供当天站立式会议照片一张 二.每个人的工作 成员 已完成工作 明天计划完成的工作 遇到的困难 林剑峰 加入搜索页面 无 陆君健 校园卡匹配功能的实现 无 石 ...