传送门

这道题的题意就是给你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](找规律+线段树)的更多相关文章

  1. A Simple Problem with Integers 循环节 修改 平方 找规律 线段树

    A Simple Problem with Integers 这个题目首先要打表找规律,这个对2018取模最后都会进入一个循环节,这个循环节的打表要用到龟兔赛跑. 龟兔赛跑算法 floyed判环算法 ...

  2. Doom HDU - 5239 (找规律+线段树)

     题目链接: D - Doom  HDU - 5239  题目大意:首先是T组测试样例,然后n个数,m次询问,然后每一次询问给你一个区间,问你这个这段区间的加上上一次的和是多少,查询完之后,这段区间里 ...

  3. USACO Overplanting ( 线段树扫描线 )

    题意 : 在二维平面上给出 N 个矩形,问你所有矩形构成的图案的面积是多少(相互覆盖的地方只计算一次) 分析 :  求矩形面积并可以模拟来做,不过使用线段树来辅助做扫描线可以更高效地求解 扫描线顾名思 ...

  4. 【BZOJ4597】[Shoi2016]随机序列 线段树

    [BZOJ4597][Shoi2016]随机序列 Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者减号 ...

  5. W - Doom HDU - 5239 线段树 找取模的规律+求一个很大的数的平方对一个数取模的写法 特别的模数==2^63-2^31

    这个题目一开始感觉还是有点难的,这个模数这么大,根本就不知道怎么写,然后去搜了题解,知道了怎么去求当x很大的时候x的平方对一个数取模怎么样不会爆掉. 然后还顺便发现了一个规律就是当一个数更新一定次数之 ...

  6. 【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 ...

  7. BZOJ 4597: [Shoi2016]随机序列 线段树 + 思维

    Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者 减号或者乘号.那么一共有 3^(n-1) 种可能的表 ...

  8. LOJ#510 北校门外的回忆(找性质+倍增+线段树)

    这题一场模拟赛我们出了弱化版(n<=1e6),抄题面给的程序能拿到71分的好成绩 其实后面的29分是加了几个1e9的数据卡人 这糟老头子真是坏得很 正解我们机房看了三天 在这里感谢这篇题解的作者 ...

  9. 51nod 1463 找朋友 (扫描线+线段树)

    1463 找朋友  基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  关注 给定: 两个长度为n的数列A .B 一个有m个元素的集合K 询问Q次 每次询 ...

随机推荐

  1. EF中 GroupJoin 与 Join

    数据: GroupJoin: 返回左表所有数据 using (tempdbEntities context = new tempdbEntities()) { var query = context. ...

  2. Centos610安装Archiva

    安装说明: https://www.cwiki.us/display/ArchivaZH/Linux+Installing+Standalone 1.下载地址 https://archiva.apac ...

  3. php 基础 判断类型

    八.PHP中判断类型 is_bool():判断是否是布尔型 is_int().is_integer()和 is_long():判断是否为整型. is_float().is_double()和 is_r ...

  4. 《JavaScript高级程序设计》读书笔记(三)基本概念第三小节 String、Object类型

    内容---语法 上一小节---数据类型 本小节 String类型---流程控制语句---理解函数 String类型--零个或者多个16位Unicode字符组成字符序列,即字符串--可以由双引号&quo ...

  5. phantomjs安装步骤

    Windows环境:1.下载http://phantomjs.org/download.html2.解压phantomjs-2.1.1-windows.zip3.配置环境变量将解压的bin目录的路径配 ...

  6. 基于 VS2019 配置 opencv4.x

    创建新项目 添加主函数文件 配置 注意,如果直接使用项目的属性去配置,那么创建新的项目的时候,还需要再配置一遍,在属性管理器里配置,创建新项目的时候,会自动应用 接下来,开始为软件配置目录和附加项.右 ...

  7. [蓝桥杯2017初赛]Excel地址

    题目描述 Excel单元格的地址表示很有趣,它使用字母来表示列号. 比如,A表示第1列,B表示第2列,Z表示第26列,AA表示第27列,AB表示第28列,BA表示第53列,.... 当然Excel的最 ...

  8. 杭电 2136 Largest prime factor(最大素数因子的位置)

    Largest prime factor Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  9. 第一节:Vuejs入门之各种指令

    一. 简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上 ...

  10. Windows远程“要求的函数不受支持”解决办法

    解决方法: 开启组策略中远程桌面链接安全层.1.开始-运行-gpedit.msc,进入组策略编辑器:2.找到左侧边栏计算机配置-管理模板-Windows组件-远程桌面服务-远程桌面会话主机-安全项:3 ...