校内模拟赛 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=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int mod = ;
const int N = ;
int p[N]; int ksm(int a,int b) {
int res = ;
while (b) {
if (b & ) res = 1ll * res * a % mod;
a = 1ll * a * a % mod;
b >>= ;
}
return res;
}
int fen(int a,int b) { return 1ll * a * ksm(b, mod - ) % mod; } int sum[N << ], tt, NowAns, n, A, B;
struct Mat{
int a[][];
Mat() { memset(a, , sizeof(a)); }
void set(int p) {
a[][] = ;
a[][] = a[][] = a[][] = p;
a[][] = (1ll * (mod + - p) % mod * tt % mod + p) % mod;
a[][] = ;
}
}T[N << ];
Mat operator * (const Mat &A, const Mat &B) {
Mat C;
for (int k = ; k < ; ++k)
for (int i = ; i < ; ++i)
for (int j = ; j < ; ++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 << ] * T[rt << | ];
sum[rt] = (sum[rt << ] + sum[rt << | ]) % 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) >> ;
build(l, mid, rt << ); build(mid + , r, rt << | );
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) >> ;
if (pos <= mid) update(l, mid, rt << , pos);
else update(mid + , r, rt << | , 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) >> ;
if (R <= mid) return query(l, mid, rt << , L, R);
else if (L > mid) return query(mid + , r, rt << | , L, R);
else return query(l, mid, rt << , L, R) * query(mid + , r, rt << | , L, R);
}
void query() {
int x = read(), y = read();
NowAns = ;
Mat now = query(, n, , x, y);
LL ans1 = NowAns, ans2 = now.a[][];
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 = ; i <= n; ++i)
ta = read(), tb = read(), p[i] = fen(ta, tb);
build(, n, );
while (Q --) {
if (read()) query();
else {
int x = read(), ta = read(), tb = read();
p[x] = fen(ta, tb);
update(, n, , x);
}
}
return ;
}
校内模拟赛 Zbq's Music Challenge的更多相关文章
- 【20170521校内模拟赛】热爱生活的小Z
学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...
- Java实现蓝桥杯第十一届校内模拟赛
有不对的地方欢迎大佬们进行评论(ง •_•)ง 多交流才能进步,互相学习,互相进步 蓝桥杯交流群:99979568 欢迎加入 o( ̄▽ ̄)ブ 有一道题我没写,感觉没有必要写上去就是给你多少MB然后求计 ...
- 【20170920校内模拟赛】小Z爱学习
所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...
- 校内模拟赛 Attack's Fond Of LeTri
Attack's Fond Of LeTri 题意: n个房子m条路径边的无向图,每个房子可以最终容纳b个人,初始有a个人,中途超过可以超过b个人,每条边有一个长度,经过一条边的时间花费为边的长度.求 ...
- 校内模拟赛 SovietPower Play With Amstar
SovietPower Play With Amstar 题意: 一棵二叉树,每次询问一条路径上的路径和,初始每个点有一个权值1,询问后权值变为0.$n \leq 10^7,m\leq10^6$ 分析 ...
- 校内模拟赛 虫洞(by NiroBC)
题意: n个点m条边的有向图,每一天每条边存在的概率都是p,在最优策略下,询问从1到n的期望天数. 分析: dijkstra. 每次一定会优先选dp最小的后继走,如果这条边不存在,选次小的,以此类推. ...
- 校内模拟赛 旅行(by NiroBC)
题意: n个点的无向图,Q次操作,每次操作可以连接增加一条边,询问两个点之间有多少条边是必经之路.如果不连通,输出-1. 分析: 首先并查集维护连通性,每次加入一条边后,如果这条边将会连接两个联通块, ...
- 校内模拟赛 coin
题意: n*m的棋盘,每个格子可能是反着的硬币,正着的硬币,没有硬币,每次可以选未选择的一行或者未选择的一列,将这一行/列的硬币取反.如果没有可选的或者硬币已经全部正面,那么游戏结束. 最后一次操作的 ...
- 校内模拟赛 Label
题意: n个点m条边的无向图,有些点有权值,有些没有.边权都为正.给剩下的点标上数字,使得$\sum\limits_{(u,v)\in E}len(u,v) \times (w[u] - w[v]) ...
随机推荐
- Spring Boot 技术总结
Spring Boot(一):入门篇 Spring Boot(二):Web 综合开发 Spring Boot(三):Spring Boot 中 Redis 的使用 Spring Boot(四):Thy ...
- [转]Docker容器可视化监控中心搭建
[原文链接]https://www.jianshu.com/p/9e47ffaf5e31?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sourc ...
- Android QMI机制
android QMI机制---概论 android QMI机制---QMUX android QMI机制---Qcril初始化流程 android QMI机制---QCRIL消息发送 android ...
- Django学习---快速搭建搜索引擎(haystack + whoosh + jieba)
Django下的搜索引擎(haystack + whoosh + jieba) 软件安装 haystack是django的开源搜索框架,该框架支持Solr,Elasticsearch,Whoosh, ...
- windows任务管理器怎么知道多个IIS网站进程分别对应哪个网站
摘要: 1.IIS网站对应的进程名一般叫w3wp.exe (windows2008系统为例,其他类似) 2.windows默认的任务管理器只能看到多个同名的进程名w3wp.exe,没法区别分别对应哪个 ...
- Java的学习路线建议(转)
https://www.cnblogs.com/huaxingtianxia/p/5724093.html
- C# 生成强命名程序集并添加到GAC
针对一些类库项目或用户控件项目(一般来说,这类项目最后编译生成的是一个或多个dll文件),在程序开发完成后,有时需要将开发的程序集(dll文件)安装部署到GAC(全局程序集缓存)中,以便其他的程序也可 ...
- mysql ANSI_QUOTES 这个sql_mode的作用(字段可以使用双引号)
首先sql_mode用于mysql的行为,sql_mode的多个值之间用','分隔: 如果想使用双引号就这样做: 1. 修改/etc/my.cnf文件 , 双引号模式是ANSI_QUOTES 或 ...
- PHP LAMP环境搭建及网站配置流程(完整版)
心血来潮想做一个自己的博客网站,写一些文章做技术分享,平时遇到的一些问题的解决办法都记录下来,网站搭建成功,那么第一篇博客自然就是整个网站的搭建以及域名的注册.备案.解析流程,总共分为以下几步: 1. ...
- 第一章 Bootstrasp起步
模板如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf ...