随机序列[SHOI2016](找规律+线段树)
这道题的题意就是给你n个数让你在每个数之间插入+、-、*三种运算符中的一种,然后算出一个答案,再把答案加起来。
这题肯定是不能暴力的(题目都告诉你了由3n-1种结果)。我们先从小的情况枚举找一找规律。
n=1
a1
n=2
2*a1+a1*a2
n=3
6*a1+2*a1*a2+a1*a2*a3
n=4
18*a1+6*a1*a2+2a1*a2*a3+a1*a2*a3*a4
发现没有?每一项是一个前缀积,每一项的系数除了最后两项都是后一项*3。这样我们就可以拿线段树维护这个答案了。
每次改我们就在[k, n]这个区间*a[k]的逆*v(除a[k]乘v),在求一下[1, n]的和就是答案了。
别忘了要把a[k]赋成v。
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const ll N = ;
const ll mod = ;
ll n, Q;
ll a[N], mul[N];
struct Segment_Tree{
ll val, tag;
}st[N << ];
ll ksm(ll x, ll y) {
ll ret = ;
while (y) {
if (y & ) ret = (ret * x) % mod;
y >>= ;
x = (x * x) % mod;
}
return ret;
}
void build(ll x, ll l, ll r) {
st[x].tag = ;
if (l == r) {
if (l == n) {
st[x].val = mul[n] % mod;
} else if (l == n - ) {
st[x].val = ( * mul[n - ]) % mod;
} else {
st[x].val = (((ksm(, n - l - ) * ) % mod) * mul[l]) % mod;
}
return;
}
ll mid = (l + r) >> ;
build(x << , l, mid);
build(x << | , mid + , r);
st[x].val = (st[x << ].val + st[x << | ].val) % mod;
}
void push_down(ll x) {
if (st[x].tag != ) {
st[x << ].tag = (st[x].tag * st[x << ].tag) % mod;
st[x << ].val = (st[x].tag * st[x << ].val) % mod;
st[x << | ].tag = (st[x].tag * st[x << | ].tag) % mod;
st[x << | ].val = (st[x].tag * st[x << | ].val) % mod;
st[x].tag = ;
}
}
void change(ll x, ll l, ll r, ll p, ll q, ll v) {
if (r < p || l > q) return;
if (p <= l && r <= q) {
st[x].tag = (st[x].tag * v) % mod;
st[x].val = (st[x].val * v) % mod;;
return;
}
push_down(x);
ll mid = (l + r) >> ;
change(x << , l, mid, p, q, v);
change(x << | , mid + , r, p, q, v);
st[x].val = (st[x << ].val + st[x << | ].val) % mod;
}
ll read() {
ll ret = , f = ;
char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') f = -;
ch = getchar();
}
while (isdigit(ch)) {
ret = (ret << ) + (ret << ) + ch - '';
ch = getchar();
}
return ret * f;
}
int main() {
mul[] = ;
n = read(), Q = read();
for (ll i = ; i <= n; i++) {
a[i] = read();
mul[i] = (mul[i - ] * a[i]) % mod;
}
build(, , n);
while (Q--) {
ll t, v;
t = read(), v = read();
change(, , n, t, n, (ksm(a[t], mod - ) * v) % mod);
cout << st[].val << "\n";
a[t] = v;
}
return ;
}
随机序列[SHOI2016](找规律+线段树)的更多相关文章
- A Simple Problem with Integers 循环节 修改 平方 找规律 线段树
A Simple Problem with Integers 这个题目首先要打表找规律,这个对2018取模最后都会进入一个循环节,这个循环节的打表要用到龟兔赛跑. 龟兔赛跑算法 floyed判环算法 ...
- Doom HDU - 5239 (找规律+线段树)
题目链接: D - Doom HDU - 5239 题目大意:首先是T组测试样例,然后n个数,m次询问,然后每一次询问给你一个区间,问你这个这段区间的加上上一次的和是多少,查询完之后,这段区间里 ...
- USACO Overplanting ( 线段树扫描线 )
题意 : 在二维平面上给出 N 个矩形,问你所有矩形构成的图案的面积是多少(相互覆盖的地方只计算一次) 分析 : 求矩形面积并可以模拟来做,不过使用线段树来辅助做扫描线可以更高效地求解 扫描线顾名思 ...
- 【BZOJ4597】[Shoi2016]随机序列 线段树
[BZOJ4597][Shoi2016]随机序列 Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者减号 ...
- W - Doom HDU - 5239 线段树 找取模的规律+求一个很大的数的平方对一个数取模的写法 特别的模数==2^63-2^31
这个题目一开始感觉还是有点难的,这个模数这么大,根本就不知道怎么写,然后去搜了题解,知道了怎么去求当x很大的时候x的平方对一个数取模怎么样不会爆掉. 然后还顺便发现了一个规律就是当一个数更新一定次数之 ...
- 【Codeforces717F】Heroes of Making Magic III 线段树 + 找规律
F. Heroes of Making Magic III time limit per test:3 seconds memory limit per test:256 megabytes inpu ...
- BZOJ 4597: [Shoi2016]随机序列 线段树 + 思维
Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者 减号或者乘号.那么一共有 3^(n-1) 种可能的表 ...
- LOJ#510 北校门外的回忆(找性质+倍增+线段树)
这题一场模拟赛我们出了弱化版(n<=1e6),抄题面给的程序能拿到71分的好成绩 其实后面的29分是加了几个1e9的数据卡人 这糟老头子真是坏得很 正解我们机房看了三天 在这里感谢这篇题解的作者 ...
- 51nod 1463 找朋友 (扫描线+线段树)
1463 找朋友 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 收藏 关注 给定: 两个长度为n的数列A .B 一个有m个元素的集合K 询问Q次 每次询 ...
随机推荐
- MQTT 入门介绍
一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级& ...
- SSIS部署后执行失败,无法将保护的XML节点解密
将包属性中的 protectionLevel 设置成DontSaveSensitive 即可.
- 正确的上网姿势:ubuntu18.04使用clash
本文为本人将CFW(Clash For Windows)上的配置文件应用到ubuntu上面的操作备忘,仅供个人使用 首先下载已经打包的clash压缩包:https://github.com/Dream ...
- VBA 学习笔记 - 判断语句、循环
判断语句 大部分和 Lua 差不多,多了一个 Switch 语句 循环 For 循环 多次执行一系列语句,缩写管理循环变量的代码. For i = start To end [Step X]...Ne ...
- 学好Linux必备知识
鸟哥的私房菜中提到学好Linux必备的几种技能: 1. 计算器概论不硬件相关知识: 因为既然想要走Linux这门路,信息相关癿基础技能也丌能没有啊! 所以先理觋一下基础癿硬件知识,丌用一定要全懂啦! ...
- Bugku-CTF社工篇之社工进阶
- HDU3172 Virtual Friends
基础并查集~ #include<cstdio> #include<algorithm> #include<cstring> #include<unordere ...
- Debian9安装Metasploit
参考博文:https://www.jianshu.com/p/ea0629b9e367 0x0 添加Kali源 deb http://http.kali.org/kali kali-rolling m ...
- c++ 读取、输出txt文件
下面这段话转自:https://blog.csdn.net/lightlater/article/details/6326338 关于文本文件的文件头 第一 ANSI文件的文件头为空,不需要处理: 第 ...
- layui弹窗全屏显示
var index =layer.open({ id: 'id', type: 2, area: ['100%', '100%'], fix: false, maxmin: true, shadeCl ...