校内模拟赛 Zbq's Music Challenge
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相关推荐
- 2017.6.11 校内模拟赛
题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...
- 第十四届蓝桥杯校内模拟赛第二期-Java个人题解(仅供参考)
刚刚结束第十四届蓝桥杯校内模拟赛第二期,在这记录下自己的代码 不保证正确! 不保证正确! 不保证正确! 有问题一起改正!! 题解 2048 代码: package _14届模拟2;public cla ...
- 2021年 第十二届蓝桥杯第二期校内模拟赛题解(Java版)
时隔多日,终于会写一些简单DP了哈哈哈! 稍微改版,方便阅读,若有错,请指出 2019年 第十届蓝桥杯省赛题解(JavaB组版) 2020年 第十一届蓝桥杯第一场省赛题解(JavaB组版) 2020年 ...
- 蓝桥杯校内模拟赛_C++组
蓝桥杯校内模拟赛 填空题 填空题比较简单,只需要在空格中填写整数答案即可: 在计算机存储中,15.125GB是多少MB? 解题思路: 1GB=1024MB,打开系统计算器计算即可 答案: 15488 ...
- 第十四届蓝桥杯校内模拟赛第一期——Python
第十四届蓝桥杯校内模拟赛第一期--Python 文章目录 第十四届蓝桥杯校内模拟赛第一期--Python 1.二进制位数 问题描述 参考答案 扩展 2. 晨跑 问题描述 参考答案 扩展 3. 调和级数 ...
- 【蓝桥】软件校内模拟赛(二)反倍数 题目+题解
文章目录 前言 反倍数 题目描述 前言 本题解为第十一届软件类校内模拟赛个人题解,但非官方满分题解,因此,可能存在下列问题 题意理解错误,导致答案错误. 代码中存在一些问题,导致答案错误. 算法复杂度 ...
- 【蓝桥】第十一届软件类校内模拟赛(二)填空题部分
起晚了起晚了,比赛都快结束了才整完qwq 文章目录 前言 填空题 1题目描述 2题目描述 3题目描述 4题目描述 前言 本题解为第十一届软件类校内模拟赛个人题解,但非官方满分题解,因此,可能存在下列问 ...
- [蓝桥杯第十一届校内模拟赛] Apare_xzc
华中师范大学蓝桥杯第十一届校内模拟赛 2020/3/22 8:00-12:00 题目还是比省赛要简单的,我9:25就做完了. 第一题 分析: 简单题,求给定的1200000的正约数的个数.我们可以暴力 ...
- 【蓝桥】第十一届软件类校内模拟赛(一)
前言 本题解为第十一届软件类校内模拟赛个人题解,但非官方满分题解,因此,可能存在下列问题 题意理解错误,导致答案错误. 代码中存在一些问题,导致答案错误. 算法复杂度的分析有误,导致不能在规定时间内得 ...
最新文章
- 证明利用快慢指针寻找有环单链表中环的起点算法
- python windows ui自动化_appium+python+windows UI自动化 四.简单使用Appium客户端
- neutron服务重启导致部分设备tag变成4095问题
- 5G时代到来,是机遇还是灾难?
- “老师,请您多关注一下我吧!!!”
- Eclipse 导入项目乱码问题
- less linux命令,less 命令用法详解
- 设计模式--责任链模式--Java实现
- java imageicon 路径_java awt ImageIcon icon 相对路径设置
- go语言调度器源代码情景分析之五:汇编指令
- Mask-RCNN训练train_shapes.ipynb
- velocity 语法
- 【笔记】Ubuntu 18.04 安装 PyQt4
- 第一次制作中秋博饼小游戏的心得与吐槽(软件工程)
- OpenCV4学习笔记(17)——常用导数算子
- 优化移动网站的9大窍门(转)
- 有了这个 Python 库,以后再也不用写正则表达式了
- 地铁 综合监控设备 及其所属子系统
- 通过禁用文件夹权限解决微信pc端朋友圈自动播放视频的问题
- 字母对应的日期 moment Element JAVA oracle mysql的日期格式