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温度的方法 引言 为了满足实时性要 ...
随机推荐
- 从零实现一个React:Luster(一):JSX解析器
前言 这是之前在掘金发的两条沸点,懒得写了,直接复制过来作为前言了.然后这个项目可能之后还会继续写,增加一些路由或者模板引擎的指令什么的,但是再过没多久寒假就有大块时间了就可能不摸这个鱼去开其它坑了, ...
- 网易云信技术分享:IM中的万人群聊技术方案实践总结
本文来自网易云信团队的技术分享,原创发表于网易云信公众号,原文链接:mp.weixin.qq.com/s/LT2dASI7QVpcOVxDAsMeVg,收录时有改动. 1.引言 在不了解IM技术的人眼 ...
- perf性能调优
工具准备 ubuntu:sudo apt-get install perf 嵌入式平台:下载源码编译 注意:编译过程中会有Auto-detectiing system feature的依赖库打印,注意 ...
- 解决移动端ios下overflow-x scroll无法隐藏滚动条的问题
这次有个需求是在web首页添加分类菜单,一共是8个分类,在移动端水平展示,可以左右滚动. 最后在手机上微信浏览器看到是有个滚动条,非常影响美观. 主要通过以下代码实现水平滚动 white-space: ...
- Spring源码系列 — BeanDefinition
一.前言 回顾 在Spring源码系列第二篇中介绍了Environment组件,后续又介绍Spring中Resource的抽象,但是对于上下文的启动过程详解并未继续.经过一个星期的准备,梳理了Spri ...
- 关于@Autowired后Spring无法注入的问题
1.对于新手来说,最明显的不过是在applicationContext.xml文件上没有加<context:component-scan base-package="com.xxx&q ...
- 基于OpenCV.Net投影法进行文本分块切割
假设有如下一张图,如何把其中的文本分块切割出来,比如“华普超市朝阳门店”.“2015-07-26”就是两个文本块. 做图像切割有很多种方法,本文描述一种最直观的投影检测法.先来看看什么是投影,简单来说 ...
- Maven快速入门--Idea版
目录 1.web项目的基本知识 1.1 项目构建 1.1.1传统的构建过程如下: 1.1.2 mavn构建项目 1.2 maven构建项目的优点: 2. 依赖管理 2.1 传统依赖管理 2.1.1 手 ...
- git did not exit cleanly (exit code 1) 的解决办法
问题描述: 关于Git的使用,在通常情况下,习惯于先在本地创建一个本地仓库,然后将项目提交到本地master,再将本地master中的项目Push 到远程仓库中,这样问题就来了. 具体错误信息如下: ...
- 【Web安全入门】三个技巧教你玩转XSS漏洞
XSS漏洞是Web应用程序中最常见的漏洞之一,想要入门Web安全的小伙伴,这个知识点是必学的. i春秋官网中有很多关于XSS漏洞的课程,新手小白可以去官网看课学习. 学习地址:https://www. ...