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温度的方法 引言 为了满足实时性要 ...
随机推荐
- vulnhub之GoldenEye-v1靶机
靶机:virtualbox 自动获取 攻击:kali linux 自动获取 设置同一张网卡开启dhcp ifconfig攻击IP是那个网段(也可以netdiscpver,不过毕竟是自己玩懒得等 ...
- python正则图片爬取
# conding:utf8 import requests import re import time if __name__ == "__main__": # 所有的数据 ur ...
- Vue.js 源码分析(十五) 指令篇 v-bind指令详解
指令是Vue.js模板中最常用的一项功能,它带有前缀v-,比如上面说的v-if.v-html.v-pre等.指令的主要职责就是当其表达式的值改变时,相应的将某些行为应用到DOM上,先介绍v-bind指 ...
- JWT简要说明
什么是JWT? JSON Web Token (JWT) 是一种开放标准 (RFC 7519) 定义了一种用于安全传输的紧凑.自包含(注:或自说明) 的Json结构, 被传输的信息可以通过JWT内容中 ...
- springboot只能一个main方法解决办法
pom.xml修改properties,增加这行 <start-class>com.eshore.main.SpringBootStarter</start-class> 或者 ...
- 关于 Scrapy 中自定义 Spider 传递参数问题
实际应用中,我们有可能在启动 Scrapy 的时候自定义一些参数来控制不同的业务流程,Google 尝试了如下方式可以实现 . 修改 Spider 构造函数 class myspider(Spide ...
- Spring Boot 2.0 快速集成整合消息中间件 Kafka
欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...
- 一篇文章,带你玩转MVVM,Dapper,AutoMapper
一.背景 由于现在做的项目都是采用WPF来进行UI设计,开发过程中都是基于MVVM来进行开发,但是项目中的MVVM并不是真正的把实体和视图进行解耦,而是将实体和视图完全融合起来,ViewModel只是 ...
- Winform的控件以及DataGridView的一般使用
先上学习测试的一些截图 1:获取多个控件上面的值(checkbox,combobox,textbox,radiobutton) 2:获取到选择行的主键ID的value,方便我们进一步CURD 3:获取 ...
- Git多账号配置
在一台电脑上配置多个不同的 ssh key 前言 如果拥有多个Git远程仓库,尤其是其中一个是工作中使用的仓库,只使用一个ssh key安全性很低,建议为不同Git远程仓库配置不同的ssh key. ...