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温度的方法 引言 为了满足实时性要 ...
随机推荐
- prisma反向代理
概要 为什么要做 prisma 的反向代理 反向代理示例(by golang) prisma 服务 gateway 服务 整体流程 认证 反向代理 权限 总结 概要 接触 prisma 有段时间了, ...
- (二十二)golang--时间和日期相关函数
时间的常量,可以获得指定时间单位 Unix和UnixNano 小例子:统计函数运行的时间:
- Centos7安装percona-xtrabackup2.4和8.0版本
Percona XtraBackup是一个基于MySQL的服务器的开源热备份实用程序 ,它不会在备份期间锁定您的数据库.无论是24x7高负载服务器还是低事务量环境,Percona XtraBackup ...
- CodeForces - 560D Equivalent Strings
Today on a lecture about strings Gerald learned a new definition of string equivalency. Two strings ...
- 【JS】---4用JS获取地址栏参数方法
用JS获取地址栏参数方法 // 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg = new Reg ...
- Gitlab的CI/CD初尝试
初衷:今天公司的前端和测试人员吵起来了.原因是测试埋怨前端人员把Bug的状态更改为已解决,结果代码根本没提交,而前端人员埋怨测试测的太频繁了,需要打几个环境的包不方便.又要改东西又要频繁打包费时间.凡 ...
- 剑指 Offer——13. 调整数组顺序使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变.这和书本不太一样. 解 ...
- Asp.Net MVC控制器获取视图传值几种方式
前台表单(V:视图) @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="v ...
- Linux CentOS 下安装.net core sdk
注册Microsoft密钥 sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm ...
- dtd的引入方式
dtd三种引入方法 //第一种引入方式: //1.dtd <?xml version="1.0" encoding="UTF-8"?> <!E ...