Zbq's Music Challenge

题意

  一个长度为n的序列,每个位置可能是1或者0,1的概率是$p_i$。对于一个序列$S$,它的得分是

$$BasicScore=A\times \sum_{i=1}^{n}{S_i} \tag{1}$$

$$ combo(i)=\left\{ \begin{aligned} &S_i & &i=1 \\ &combo(i-1)+1 & &i\neq 1 ~\mathrm{and}~ S_i=1 \\ &combo(i-1)\times t & &\mathrm{otherwise} \end{aligned} \tag{2} \right.$$

$$ComboScore=B\times \sum_{i=1}^{n}{S_i\times combo(i)} \tag{3}$$

$$TotalScore=BasicScore+ComboScore \tag{4}$$

  两种操作,修改每个位置的概率,询问一段区间得分的期望,答案对$998244353$取模。

分析

  分成两部分算,$BasicScore$可以对$p_i$求和得到。

  对于每段区间,$f[i]$设第i位置数字期望是多少,那么$ComboScore = B \times \sum\limits_{i=l}^{r} p_i \times (f[i-1] + 1) $。

  然后转移可以写成矩阵的形式。

  $$ \left[ \begin{matrix} 1 & p_i & p_i \\ 0 & (1 - p_i) \times t + p_i & p_i\\ 0 & 0 & 1 \end{matrix} \right] \times \left[ \begin{matrix} sum\\ f[i - 1]\\ 1 \end{matrix} \right] = \left[ \begin{matrix} sum' \\ f[i]\\ 1 \end{matrix} \right] $$

  于是,线段树维护一下即可。复杂度$O(nlogn \times 3^3)$

代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cctype>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;
typedef long long LL;

inline int read() {int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
}const int mod = 998244353;
const int N = 500005;
int p[N];int ksm(int a,int b) {int res = 1;while (b) {if (b & 1) res = 1ll * res * a % mod;a = 1ll * a * a % mod;b >>= 1;}return res;
}
int fen(int a,int b) { return 1ll * a * ksm(b, mod - 2) % mod; }int sum[N << 2], tt, NowAns, n, A, B;
struct Mat{ int a[3][3]; Mat() { memset(a, 0, sizeof(a)); }void set(int p) {a[0][0] = 1;a[0][1] = a[0][2] = a[1][2] = p;a[1][1] = (1ll * (mod + 1 - p) % mod * tt % mod + p) % mod;a[2][2] = 1;}
}T[N << 2];
Mat operator * (const Mat &A, const Mat &B) {Mat C;for (int k = 0; k < 3; ++k) for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) C.a[i][j] = (C.a[i][j] + 1ll * A.a[i][k] * B.a[k][j] % mod) % mod;return C;
}
inline void pushup(int rt) {T[rt] = T[rt << 1] * T[rt << 1 | 1]; sum[rt] = (sum[rt << 1] + sum[rt << 1 | 1]) % mod;
}
void build(int l,int r,int rt) {if (l == r) {T[rt].set(p[l]); sum[rt] = p[l]; return ;        }int mid = (l + r) >> 1;build(l, mid, rt << 1); build(mid + 1, r, rt << 1 | 1);pushup(rt);
}
void update(int l,int r,int rt,int pos) {if (l == r) {T[rt].set(p[l]); sum[rt] = p[l]; return ;}int mid = (l + r) >> 1;if (pos <= mid) update(l, mid, rt << 1, pos);else update(mid + 1, r, rt << 1 | 1, pos);pushup(rt);
}
Mat query(int l,int r,int rt,int L,int R) {if (L <= l && r <= R) { NowAns = (NowAns + sum[rt]) % mod; return T[rt]; }int mid = (l + r) >> 1;if (R <= mid) return query(l, mid, rt << 1, L, R);else if (L > mid) return query(mid + 1, r, rt << 1 | 1, L, R);else return query(l, mid, rt << 1, L, R) * query(mid + 1, r, rt << 1 | 1, L, R);
}
void query() {int x = read(), y = read();NowAns = 0;Mat now = query(1, n, 1, x, y);LL ans1 = NowAns, ans2 = now.a[0][2];cout << (1ll * ans1 * A % mod + 1ll * ans2 * B % mod) % mod << "\n";
}
int main() {read();n = read();int Q = read(), ta = read(), tb = read();A = read(), B = read();tt = fen(ta, tb);for (int i = 1; i <= n; ++i) ta = read(), tb = read(), p[i] = fen(ta, tb);build(1, n, 1);while (Q --) {if (read()) query();else {int x = read(), ta = read(), tb = read(); p[x] = fen(ta, tb);update(1, n, 1, x); }}return 0;
}

转载于:https://www.cnblogs.com/mjtcn/p/10651188.html

校内模拟赛 Zbq's Music Challenge相关推荐

  1. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  2. 第十四届蓝桥杯校内模拟赛第二期-Java个人题解(仅供参考)

    刚刚结束第十四届蓝桥杯校内模拟赛第二期,在这记录下自己的代码 不保证正确! 不保证正确! 不保证正确! 有问题一起改正!! 题解 2048 代码: package _14届模拟2;public cla ...

  3. 2021年 第十二届蓝桥杯第二期校内模拟赛题解(Java版)

    时隔多日,终于会写一些简单DP了哈哈哈! 稍微改版,方便阅读,若有错,请指出 2019年 第十届蓝桥杯省赛题解(JavaB组版) 2020年 第十一届蓝桥杯第一场省赛题解(JavaB组版) 2020年 ...

  4. 蓝桥杯校内模拟赛_C++组

    蓝桥杯校内模拟赛 填空题 填空题比较简单,只需要在空格中填写整数答案即可: 在计算机存储中,15.125GB是多少MB? 解题思路: 1GB=1024MB,打开系统计算器计算即可 答案: 15488 ...

  5. 第十四届蓝桥杯校内模拟赛第一期——Python

    第十四届蓝桥杯校内模拟赛第一期--Python 文章目录 第十四届蓝桥杯校内模拟赛第一期--Python 1.二进制位数 问题描述 参考答案 扩展 2. 晨跑 问题描述 参考答案 扩展 3. 调和级数 ...

  6. 【蓝桥】软件校内模拟赛(二)反倍数 题目+题解

    文章目录 前言 反倍数 题目描述 前言 本题解为第十一届软件类校内模拟赛个人题解,但非官方满分题解,因此,可能存在下列问题 题意理解错误,导致答案错误. 代码中存在一些问题,导致答案错误. 算法复杂度 ...

  7. 【蓝桥】第十一届软件类校内模拟赛(二)填空题部分

    起晚了起晚了,比赛都快结束了才整完qwq 文章目录 前言 填空题 1题目描述 2题目描述 3题目描述 4题目描述 前言 本题解为第十一届软件类校内模拟赛个人题解,但非官方满分题解,因此,可能存在下列问 ...

  8. [蓝桥杯第十一届校内模拟赛] Apare_xzc

    华中师范大学蓝桥杯第十一届校内模拟赛 2020/3/22 8:00-12:00 题目还是比省赛要简单的,我9:25就做完了. 第一题 分析: 简单题,求给定的1200000的正约数的个数.我们可以暴力 ...

  9. 【蓝桥】第十一届软件类校内模拟赛(一)

    前言 本题解为第十一届软件类校内模拟赛个人题解,但非官方满分题解,因此,可能存在下列问题 题意理解错误,导致答案错误. 代码中存在一些问题,导致答案错误. 算法复杂度的分析有误,导致不能在规定时间内得 ...

最新文章

  1. 证明利用快慢指针寻找有环单链表中环的起点算法
  2. python windows ui自动化_appium+python+windows UI自动化 四.简单使用Appium客户端
  3. neutron服务重启导致部分设备tag变成4095问题
  4. 5G时代到来,是机遇还是灾难?
  5. “老师,请您多关注一下我吧!!!”
  6. Eclipse 导入项目乱码问题
  7. less linux命令,less 命令用法详解
  8. 设计模式--责任链模式--Java实现
  9. java imageicon 路径_java awt ImageIcon icon 相对路径设置
  10. go语言调度器源代码情景分析之五:汇编指令
  11. Mask-RCNN训练train_shapes.ipynb
  12. velocity 语法
  13. 【笔记】Ubuntu 18.04 安装 PyQt4
  14. 第一次制作中秋博饼小游戏的心得与吐槽(软件工程)
  15. OpenCV4学习笔记(17)——常用导数算子
  16. 优化移动网站的9大窍门(转)
  17. 有了这个 Python 库,以后再也不用写正则表达式了
  18. 地铁 综合监控设备 及其所属子系统
  19. 通过禁用文件夹权限解决微信pc端朋友圈自动播放视频的问题
  20. 字母对应的日期 moment Element JAVA oracle mysql的日期格式

热门文章

  1. 子元素增加margin-top会增加给父元素的问题
  2. H5学习之旅-H5列表(8)
  3. window 系统上传文件到linux 系统出现dos 格式换行符
  4. Android有道词典查询功能
  5. [转载]ext4的noatime
  6. SmartTemplate学习入门一
  7. [MicroPython]stm32f407控制DS18B20检测温度
  8. 线程间的协作(3)——管道输入/输出流
  9. javascript/jquery高度宽度详情解说分析
  10. Linux日志文件总管——logrotate