[SDOI2019]快速查询

[题目链接]

链接

[思路要点]

据说是 \(\text{SDOI2019}\) 最水的题

操作次数为 \(1e7\) 范围,显然要求每次操作 \(\mathcal{O}(1)\) 完成

并不需要任何数据结构维护

由于不同的操作数量为 \(1e5\) 级别,可以将所有涉及到的变量离散化出来,并且使用数组直接存储,其它的一些变量全程中值都相同,只需要一个变量记录

如果没有全体赋值的操作,只需要记录一个 \(A\) 和 \(B\) 以及每个数的初值,表示当前某个数的值是其初值乘上 \(A\) 再加 \(B\),对于单点修改操作,假设修改后的数是 \(x\),完全可以将这个位置的初值改成 \(y\) 满足 \(Ay+B=x\)。由于 \(A\) 一定非零且模数为质数,所以这样的 \(y\) 一定存在,对于全体加和全体乘操作可以直接修改 \(A\) 和 \(B\) 的值

对于全体赋值,需要更改一下初值,同样很好实现

注意对于乘上 \(0\) 的操作,实质上是全体赋值,需要特殊处理

[代码]

// Copyright: lzt
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cmath>
#include<iostream>
#include<queue>
#include<string>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<long long,long long> pll;
typedef pair<int, pair<int, long long> > lzt;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define rep(i,j,k) for(register int i=(int)(j);i<=(int)(k);i++)
#define rrep(i,j,k) for(register int i=(int)(j);i>=(int)(k);i--)
#define Debug(...) fprintf(stderr, __VA_ARGS__) 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;
} const int mod = 10000019;
const int maxn = 10001000;
int n, q, t, ans;
int fac[maxn], ifac[maxn], inv[maxn];
vector<int> vec; inline void dd(int &x) {
x %= mod;
if (x < 0) x += mod;
} struct Ope {
int tp;
int x, y;
inline void re() {
tp = read();
if (tp == 1) x = read(), y = read();
else if (tp != 6) x = read();
if (tp == 1) dd(y);
else if (tp != 6) dd(x);
if (tp == 3 && x == 0) tp = 4;
}
inline void pr() {
if (tp == 1) printf("%d %d %d\n", tp, x, y);
else if (tp == 6) printf("%d\n", tp);
else printf("%d %d\n", tp, x);
}
} op[100100]; inline int ksm(int x, int p) {
int ret = 1;
while (p) {
if (p & 1) ret = ret * 1ll * x % mod;
p >>= 1; x = x * 1ll * x % mod;
}
return ret;
} inline int getid(int x) {
return (int)(lower_bound(vec.begin(), vec.end(), x) - vec.begin()) + 1;
} int sum, num, vv;
int A, B, tot = 1;
int val[1000100], nw[1000100]; inline void add(int &x, int y) {
x += y;
if (x >= mod) x -= mod;
}
inline void sub(int &x, int y) {
x -= y;
if (x < 0) x += mod;
}
inline int fnd(int ind) {
if (nw[ind] == tot) return val[ind];
return vv;
}
inline int calc(int v) {
sub(v, B);
// cout<<"fuc"<<v<<' '<<A<<' '<<inv[A]<<endl;
return v * 1ll * inv[A] % mod;
} inline void fuck(int x) {
// Debug("ans %d\n", x);
add(ans, x);
} inline void doit(int ind) {
Ope o = op[ind];// o.pr();
if (o.tp == 6) fuck((sum * 1ll * A + B * 1ll * n) % mod);
else if (o.tp == 1) {
sub(sum, fnd(o.x)), val[o.x] = calc(o.y), nw[o.x] = tot, add(sum, fnd(o.x));
// Debug("shit %d\n", val[o.x]);
}
else if (o.tp == 2) B = (B + o.x) % mod;
else if (o.tp == 3) {
A = A * 1ll * o.x % mod;
B = B * 1ll * o.x % mod;
} else if (o.tp == 4) {
tot++;
sum = o.x * 1ll * n % mod;
A = 1; B = 0; vv = o.x;
} else fuck((fnd(o.x) * 1ll * A + B) % mod);
} void work() {
fac[0] = 1; rep(i, 1, mod - 1) fac[i] = fac[i - 1] * 1ll * i % mod;
ifac[mod - 1] = ksm(fac[mod - 1], mod - 2); rrep(i, mod - 2, 0) ifac[i] = ifac[i + 1] * 1ll * (i + 1) % mod;
rep(i, 1, mod - 1) inv[i] = fac[i - 1] * 1ll * ifac[i] % mod;
n = read(); q = read();
rep(i, 1, q) {
op[i].re();
if (op[i].tp == 1 || op[i].tp == 5) vec.pb(op[i].x);
}
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
// cout<<vec.size()<<endl;
rep(i, 1, q) if (op[i].tp == 1 || op[i].tp == 5) {
op[i].x = getid(op[i].x);
}
t = read(); A = 1; B = 0;
rep(i, 1, t) {
int a = read(), b = read();
rep(j, 1, q) {
int nw = (a + j * 1ll * b) % q + 1;
doit(nw);
}
}
printf("%d\n", ans);
} int main(){
#ifdef LZT
freopen("in","r",stdin);
#endif work(); #ifdef LZT
Debug("My Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
}

[SDOI2019]快速查询的更多相关文章

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

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

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

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

  3. vijos2051 SDOI2019 快速查询

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

  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. 安装Erlang使用RabbitMQ

    首先登陆官网进行下载:https://www.erlang.org/downloads/20.3 本次下载的版本是20.3,rabbitmq准备使用3.7.17版本 现在开始安装 因为是使用c#语言, ...

  2. web开发中SESSION的本质

    有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制.我们先简单的了解一些http的知识,从而理解该协议的无 ...

  3. oracle 11g 执行先决条件检查失败的解决方法

    在安装oracle 11g时,出现执行先决条件失败的情况如下: 你可以忽略所有强制安装,一般不会影响功能,但如果你想知道为什么会产生这种错误, 并且当出现以上情况时又该如何解决呢?如下列出了原因和解决 ...

  4. django 多条数据显示的坑(怪自己)

    今天的问题是,一个接口执行了很多次,每次都会在结果表里面记录一条结果信息,在查看接口详情页面,我想只展示一条,然后就进入误区了 第一个是怪自己手残,api_id  被自己写成app_id了 第二个是筛 ...

  5. hdu 6134: Battlestation Operational (2017 多校第八场 1002)【莫比乌斯】

    题目链接 比赛时没抓住重点,对那个受限制的“分数求和”太过关心了..其实如果先利用莫比乌斯函数的一个性质把后面那个[gcd(i,j)=1]去掉,那么问题就可以简化很多.公式如下 这和之前做过的一道题很 ...

  6. 如何将word内容粘贴到富文本编辑器里面

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...

  7. leetcode_1293. Shortest Path in a Grid with Obstacles Elimination_[dp动态规划]

    题目链接 Given a m * n grid, where each cell is either 0 (empty) or 1 (obstacle). In one step, you can m ...

  8. next_permutation():按字典序输出下一个排列

    #include<iostream> #include<algorithm> using namespace std; int main() { int data[4]={5, ...

  9. Web 开发中很实用的效果【源码下载】

    网页特效下载 引用地址:http://www.yyyweb.com/350.html 超炫的页面切换动画效果 今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应 ...

  10. [CSP-S模拟测试]:嘟嘟噜(约瑟夫问题)

    题目描述 由于众所周知的原因,冈部一直欠真由理一串香蕉.为了封上真由理的嘴,冈部承诺只要真由理回答出这个问题,就给她买一车的香蕉:一开始有$n$个人围成一个圈,从$1$开始顺时针报数,报出$m$的人被 ...