校内模拟赛 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TSQL中实现ORACLE的多列IN 多列匹配。

期望效果&#xff1a;&#xff08;我是拿到一对关系去另一表中的一对关系去对比&#xff09;select * From Empoylee Where (Address1,Address2) in (Select Address1,Address2 From EmpoyleeAdresses Where Country Canada)以上无法实现用这种方案也可以实现 不过速度很慢的s…

ClickedOnce部署方法

1.ClickedOnce部署时有些DLL和配置文件无法自动部署到系统当中&#xff0c;只能用Manifest Manager Tool 修改manifest 文件 /Files/Tonyyang/Software/ManifestManagerUtility.rar 2.部署文件结构 3.部署方法 首先用VS自带的ClickedOnce发布应用程序&#xff08;博客园有&…

自旋锁/互斥锁/读写锁/递归锁的区别与联系

自旋锁 互斥锁 读写锁 递归锁 互斥锁(mutexlock)&#xff1a; 最常使用于线程同步的锁&#xff1b;标记用来保证在任一时刻&#xff0c;只能有一个线程访问该对象&#xff0c;同一线程多次加锁操作会造成死锁&#xff1b;临界区和互斥量都可用来实现此锁&#xff0c;通常情况下…

树莓派安装MySQL数据库与卸载

出处&#xff1a; 1、http://www.cnblogs.com/liyangLife/p/4500115.html 2、https://blog.csdn.net/huayucong/article/details/49736427 3、https://www.imooc.com/article/23132?block_idtuijian_wz 4、http://www.runoob.com/mysql/mysql-install.html&#xff08;Debian系…

关于selectNodes与selectSingleNode的用法的区别

今天在网上看到一个关于selectNodes与selectSingleNode的用法的区别。 由于之前没有特别在意&#xff0c;因而今日看见是很是惊异。特复制过来&#xff0c;供大家一起学习&#xff01; 其中文中提到了最重要的区别是在运用操作后的变化。 selectnodes: selectNodes和ChildNo…

第七章 数组

7.1、数组概述 7.1.1、为什么需要数组 答&#xff1a;有时候需要存储或处理一系列数据&#xff0c;数组就可以充当这样的角色&#xff0c;它在内存中是相连的数据&#xff0c;并且在栈中的引用只有一个&#xff0c; 如果不用数组&#xff0c;那数据就得一个一个定义一个一个声明…

notify_one() 或 notify_all() 在c++中的使用要点

notify_one() 或 notify_all() 如果在锁(mutex spin_lock)里调用&#xff0c;可能会导致被立刻唤醒的线程继续阻塞&#xff0c;因为锁被notify线程持有。 c标准上说&#xff0c;一些实现(尤其是许多 pthread 的实现)为了归避这种情况&#xff0c;在通知调用中&#xff0c;直接将…

[转载]Asp.net MVC中Controller返回值类型

Asp.net MVC中Controller返回值类型在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求&#xff1a; 必须是一个public方法必须是实例方法没有标志NonActionAttribute特性的(NoAction)不能被重载必须返回ActionResult类型如: [cs…

Visual Studio.net 2010 Windows Service 开发,安装与调试

本示例完成一个每隔一分钟向C:\log.txt文件写入一条记录为例&#xff0c;讲述一个Windows Service 程序的开发,安装与调试 原程序&#xff0c;加文档示例下载 /Files/zycblog/SourceCode.rar 目录索引 1 开发工具 2 开发过程 3 安装 4 开发调试 5 注意事项 6 参考资料…

ArcGis dbf读写——挂接Excel到属性表 C#

ArcMap提供了挂接Excel表格信息到属性表的功能&#xff0c;但是当数据量较大到以万计甚至十万计的时候这个功能就歇菜了&#xff0c;当然&#xff0c;你可以考虑分段挂接。这个挂接功能只是做了一个表关联&#xff0c;属性记录每个字段的信息需要通过“字段计算器”计算过来。 …

JQuery. Parse XML children recursively. How? - Stack Overflow

JQuery. Parse XML children recursively. How? - Stack OverflowJQuery. Parse XML children recursively. How?

presto领读 查询引擎翻译

原文链接&#xff1a;https://prestodb.io/docs/current/overview/concepts.html#data-sources 最近在看presto-分布式SQL查询引擎的代码&#xff0c;使用翻译工具翻译了一版&#xff0c;有些概念比较难以理解&#xff0c;整理如下&#xff1a; 一、概览 虽然很容易理解语句和…

VisualStudioAddIn2017.vsix的下载安装和使用

本加载项是用于Visual Studio的&#xff0c;下载以后按照如下步骤进行安装&#xff1a; 完全退出Visual Studio把下载了的文件解压缩&#xff0c;会产生一个VisualStudioAddIn2017.vsix文件双击该文件&#xff0c;按照提示安装重启Visual Studio安装完成后的使用方法&#xff0…

Presto基本概念

Presto基本概念 Presto是Facebook开源的MPP SQL引擎&#xff0c;旨在填补Hive在速度和灵活性&#xff08;对接多种数据源&#xff09;上的不足。相似的SQL on Hadoop竞品还有Impala和Spark SQL等。这里我们介绍下Presto的基本概念&#xff0c;为后续的笔记做基础。 Operator …

2019春第六周编程总结

这个作业属于哪个课程C语言程序设计Ⅱ这个作业要求在哪里https://edu.cnblogs.com/campus/zswxy/MS/homework/2829我在这个课程的目标是利用指针知识解决相关实际问题在具体哪方面帮我实现目标设计密码开锁、交换变量解决问题以及电码加密参考文献C语言基础、http://www.w3scho…

昨天7月21号,笑笑又生病了

21号从上午就开始发烧,中午吃了安瑞克烧退了,但是下午6点左右又开始发烧了,再次吃安瑞克,效果不是太好,还是烧,睡了觉之后烧退了。晚上十点又开始发烧&#xff0c;吃美林悬浮液烧还是没退&#xff0c;又吃安瑞克&#xff0c;还是烧&#xff0c;到了一点钟,烧,但稍微好一点 22号…

Exchange企业实战技巧(26)在Outlook中打开多个邮箱

工作中&#xff0c;有时要需要让某个用户在outlook中同时打开多个exchange邮箱&#xff0c;对于outlook2010来说&#xff0c;是支持多个Exchange邮箱用户账户的并存&#xff0c;而outlook2007则不支持。那该功能有没其他实现方法呢&#xff1f;答案是有的。 如果你的Exchange是…

sql 为什么要用where 1=1或者where 1 =0 ?

一、不用where 11 在多条件查询中的困扰   举个例子&#xff0c;如果您做查询页面&#xff0c;并且&#xff0c;可查询的选项有多个&#xff0c;同时&#xff0c;还让用户自行选择并输入查询关键词&#xff0c;那么&#xff0c;按平时的查询语句的动态构造&#xff0c;代码…

Java元数据总结:Java注释的使用和定义

元数据从metadata一词译来&#xff0c;就是“关于数据的数据”的意思。越来越的开源框架都提供了“元数据”支持了&#xff0c;其实也就是注释支持。今天系统学习一下Java注释(Java元数据)。本文内容不限于Javadoc的注释。  1.什么是Java元数据&#xff0c;有什么作用?  元…

Emulator Error: Could not load OpenGLES emulati...

为什么80%的码农都做不了架构师&#xff1f;>>> 模拟器提示警告&#xff1a;Emulator Error: Could not load OpenGLES emulation library: Could not load DLL! 亲测可用&#xff1a; 从SDK\tools\lib目录下将一下四个dll文件复制到SDK\tools&#xff0c;重启模…