传送门

这道题的题意就是给你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. redis-py相关

    一 redis客户端命令 cmd进入redis客户端管理程序路径xx:\windows redis\redis-2.4.0-win32-win64\64bit 执行:redis-cli.exe -h ...

  2. SpringMVC Controller 接收页面传递的中文参数出现乱码

    在Controller中接收到的POST参数如果是中文的话,显示为乱码.已知客户端传过来时编码为UTF-8. 问题产生分析: spring MVC中默认的编码格式为“ISO-8859-1”,因此造成乱 ...

  3. Jenkins显示语言切换为中文(最终解决办法)

    网上大部分搜索结果都指向同一种方法就是下载Locale插件,但该方法已失效. 新的解决办法: 下载完成之后重启Jenkins生效,会汉化大部分内容,部分设置不会汉化. 注:重启后不生效请检查 1.已安 ...

  4. cmd添加管理员账号

    net user 用户名 密码 /add net localgroup Administrators 用户名 /add

  5. dapper基本操作

    https://www.cnblogs.com/vichin/p/9289969.html

  6. spark实验(四)--RDD编程(1)

    一.实验目的 (1)熟悉 Spark 的 RDD 基本操作及键值对操作: (2)熟悉使用 RDD 编程解决实际具体问题的方法. 二.实验平台 操作系统:centos6.4 Spark 版本:1.5.0 ...

  7. XCOJ 1249: 全自动奖学金计算系统

    1249: 全自动奖学金计算系统 时间限制: 1 Sec  内存限制: 64 MB提交: 305  解决: 54 标签提交统计讨论版 题目描述 宣城校区从今年开始,在原有奖学金制度上,设立专项奖学金. ...

  8. MySQL自动备份实战--xtrabackup备份

    MySQL数据备份企业实战.制作shell脚本 功能1:使用xtrabackup以每周为一个备份周期做备份(数据库+二进制日志,备份至本地/data/backup).提示: 周一某个时间点做一次完全备 ...

  9. OBS输出设置

    参数建议来自虎牙 https://help.huya.com/284 3.输出: 1)编码器中x264相当于虎牙直播中的CPU H.264编码,NVENC H.264相当于虎牙直播中的NVIDIA H ...

  10. jqGird错误“decimalSeparator”的解决办法

    在使用jqGrid的过程中,突然出现以下错误: jquery.jqGrid.js:15016 Uncaught TypeError: Cannot read property 'decimalSepa ...