AtCoder Regular Contest 177 D. Earthquakes(概率 单调栈)

题目

D - Earthquakes

思路来源

官方题解

题解

对于不存在连锁反应的区间,每个区间独立处理,最后求个乘积

对于每个区间,相邻的两个杆子距离都小于H,

意味着没倒的区间是个连续的区间,假设要算i的概率

一定是第i次地震时,i从没倒变成倒了,并且i倒完之后,所有都倒了

那在i倒之前,i是这个连续的区间的左端点或右端点

举个例子,比如6 1 3 2 4 5,

如果3在第三轮倒,并且把其他所有的都带倒了,一定是以下两种情况之一:

①3朝左倒:3右边的比3小的都往右倒了,并且把比3大的都带倒了,也就意味着3右边第一个就是比3小的,并且右边每一个比3小的都向右倒了

②3朝右倒:同理,3左边第一个就比3小,并且左边每一个比3小的都向左倒了

统计同一个块内左侧右侧小的数个数,用单调栈解决

计两侧比3小的数量为cnt1,首先概率需要乘上cnt1

此外,考察与3相邻的两个数,

1. 左右都比3小,3就两侧都可以倒,

2. 否则,有一个比3小,就只能倒向另一侧

3. 如果都比3大就没有合法方案了

也就是,与3相邻的两个数比3小的个数为cnt,则概率还需要乘上(1/2)*cnt

算完i所在的块的之后,还需要乘上其他块在第i轮都倒了的概率

这个现算很难算,但是注意到,其他块能在第i轮都倒了,

一定是在[1,i-1]轮里的某一轮倒的,而之前的概率在对应块里算过,

所以,对于每个块,维护一下全倒了的概率和即可,

第i轮全倒的概率,是这若干个其他块已经倒了 和 i所在的块在第i轮倒的积

输出完之后,把新增概率加到当前块的概率和里

由于0不存在逆元,所以记录一下概率为0的块的个数,分别维护0的个数和概率乘积

代码

#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=2e5+10,mod=998244353,inv2=(mod+1)/2;
int modpow(int x,int n,int mod){
    int res=1;
    for(;n;n/=2,x=1ll*x*x%mod){
        if(n&1)res=1ll*res*x%mod;
    }
    return res;
}
int n,h,x[N],id[N],par[N],ans[N],cnt[N],zero;
int stk[N],c,l[N],r[N];
int main(){
    sci(n),sci(h);
    rep(i,1,n){
        sci(x[i]);
        id[i]=i;
        par[i]=i;
    }
    sort(id+1,id+n+1,[&](int a,int b){
        return x[a]<x[b];
    });
    rep(i,1,n){
        int p=id[i],pre=id[i-1];
        if(i==1 || x[pre]<x[p]-h)par[p]=p,c=0,zero++;
        else par[p]=par[pre];
        if(stk[c]<=p)cnt[p]++;
        while(c && stk[c]>p)c--;
        l[p]=c;
        stk[++c]=p;
    }
    //stk[c=0]=0;
    c=0;
    per(i,n,1){
        int p=id[i];
        if(c && x[stk[c]]>x[p]+h)c=0;
        if(stk[c]<=p)cnt[p]++;
        while(c && stk[c]>p)c--;
        r[p]=c;
        stk[++c]=p;
    }
    int prob=1,bs=1ll*modpow(2,n,mod);
    rep(i,1,n){
        //printf("i:%d par:%d cnt:%d l+r:%d ans:%d\n",i,par[i],cnt[i],l[i]+r[i],ans[par[i]]);
        int &p=ans[par[i]];
        if(p)prob=1ll*prob*modpow(p,mod-2,mod)%mod;            
        else zero--;
        int add=1ll*cnt[i]*inv2%mod*modpow(inv2,l[i]+r[i],mod)%mod;
        int ans=zero?0:1ll*prob*add%mod*bs%mod;
        printf("%d%c",ans," \n"[i==n]);
        p=(p+add)%mod;
        if(p)prob=1ll*prob*p%mod;
        else zero++;
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

金三银四面试题(二十七):适配器模式知多少?

什么是适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换为客户期望的另一个接口。通过适配器&#xff0c;原本不兼容的接口可以一起工作&#xff0c;从而提高系统的灵活性和可扩展性。 关键元素&…

JVM 类的加载器

文章目录 1. 作用2. 类加载器的显示加载与隐式加载3. 类加载机制的必要性4. 加载的类是唯一的吗5. 类加加载机制的基本特征(了解) 1. 作用 类加载器是 JVM 执行类加载机制的前提。 ClassLoader 的作用&#xff1a; ClassLoader 是 Java 的核心组件&#xff0c;所有的 Class 都…

C++基础与深度解析 | C++初探 | Hello World | 系统I/O | 控制流 | 结构体与自定义数据类型

文章目录 一、从Hello World谈起二、系统I/O三、控制流四、结构体与自定义数据类型 一、从Hello World谈起 #include <iostream>void fun(const char *pInfo) {std::cout << pInfo << std::endl; }int main() {fun("Hello World!");fun("Hel…

【补充】图神经网络前传——DeepWalk

论文阅读 论文&#xff1a;https://arxiv.org/pdf/1403.6652 参考&#xff1a;【论文逐句精读】DeepWalk&#xff0c;随机游走实现图向量嵌入&#xff0c;自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客 abstract DeepWalk是干什么的&#xff1a;在一个网络中学习顶点…

求最大梯形的面积

【入门】求最大梯形的面积 今天做4星题单发现一个好玩的&#xff08;太简单了&#xff09;。 说明 从键盘读入n(3<n<100)个梯形的上底、下底和高&#xff0c;请问这n个梯形中&#xff0c;最大面积的梯形的面积是多少&#xff1f;&#xff08;梯形面积的求解公式为 S …

ExcelVBA在选择区域(有合并)中删除清除空行

【问题】 关于删除空行&#xff0c;以前是用函数来完成工作的&#xff0c; 今天有人提出问题&#xff0c;传来这个文件&#xff0c; 现有数据&#xff0c;1w多行&#xff0c;其中有部分列有不同合并单元格&#xff0c;跨行也不一样。如果要进行筛选删除空行&#xff0c;有一定的…

Rerank进一步提升RAG效果

RAG & Rerank 目前大模型应用中&#xff0c;RAG&#xff08;Retrieval Augmented Generation&#xff0c;检索增强生成&#xff09;是一种在对话&#xff08;QA&#xff09;场景下最主要的应用形式&#xff0c;它主要解决大模型的知识存储和更新问题。 简述RAG without R…

买卖股票的最佳时机 II(LeetCode 122)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

整体安全设计

人员和资产的安全是当今许多组织的最高优先事项之一。随着暴力事件在美国各地盛行——枪击事件、袭击、内乱等——建筑物业主必须为其建筑物及其居住者的安全做好计划。 为了创造一个安全的环境&#xff0c;新设施或园区的安全设计必须超越基本的摄像头和访问控制设备&#xf…

HarmonyOS开发案例:【UIAbility内和UIAbility间页面的跳转】

UIAbility内和UIAbility间页面的跳转&#xff08;ArkTS&#xff09; 介绍 基于Stage模型下的UIAbility开发&#xff0c;实现UIAbility内和UIAbility间页面的跳转。包含如下功能&#xff1a; UIAbility内页面的跳转。跳转到指定UIAbility的首页。跳转到指定UIAbility的指定页…

centos7安装MySQL(rpm安装)

centos7安装MySQL&#xff08;rpm安装&#xff09; 准备工作1、卸载不要的环境2、获取MySQL官方yum源3、下载官方的yum源 安装可能遇到问题:描述解决方法&#xff1a; 配置添加远程访问用户设置MySql不区分大小写 准备工作 1、卸载不要的环境 grep mariadb # 先检查是否有mar…

【Java】/*方法的使用-快速总结*/

目录 一、什么是方法 二、方法的定义 三、实参和形参的关系 四、方法重载 五、方法签名 一、什么是方法 Java中的方法可以理解为C语言中的函数&#xff0c;只是换了个名称而已。 二、方法的定义 1. 语法格式&#xff1a; public static 返回类型 方法名 (形参列表) { //方…

【GD32】02-ADC模拟数字转换器

ADC 在电子和通信技术中&#xff0c;ADC&#xff08;模拟数字转换器&#xff09;是一种将模拟信号转换为数字信号的电子设备。这种转换是电子系统中非常关键的一个环节&#xff0c;因为数字信号更易于处理、存储和传输。ADC的工作原理通常包括采样、保持、量化和编码等步骤。采…

数据结构与算法===回溯法

文章目录 原理使用场景括号生成代码 小结 原理 回溯法是采用试错的思想&#xff0c;它尝试分步骤的去解决一个问题。在分步骤解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&#x…

wsl安装Xfce桌面并设置系统语言和输入法

一、安装xfce &#xff08;有相关的依赖都会安装&#xff09; sudo apt -y install xfce4 二、 安装远程连接组件 sudo apt install xrdp -y 并重新启动 Xrdp 服务&#xff1a; sudo systemctl restart xrdp 本地windows系统中请按 winR 键 呼出运行 在运行中输入 mstsc…

最简单的Winapi编程窗口程序

以下是一个简单的使用 WinAPI 创建窗口的程序示例&#xff0c;大致了解下win32的一个窗口编程大致流程&#xff1a; #include <Windows.h>// 窗口过程函数 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg){case WM_DES…

Ubuntu24 文件目录结构——用户——权限 详解

目录 权限 用户 文件目录结构 一个目录可以有程序&#xff0c;目录&#xff0c;文件&#xff0c;以及这三者的链接。可以看到还分别有使用者和权限信息。 每个文件和目录都有与之关联的三个主要属性&#xff1a;所有者&#xff08;owner&#xff09;、组&#xff08;group&a…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout 文章编号&#x…

【JavaEE】Spring Boot 入门:快速构建你的第一个 Spring Boot 应用

目录 第一个SpringBoot程序介绍项目创建创建项目目录介绍输出Hello World 第一个SpringBoot程序 介绍 在学习SpringBoot之前, 我们先来认识⼀下Spring 我们看下Spring官⽅(https://spring.io/)的介绍 可以看到, Spring让Java程序更加快速, 简单和安全. Spring对于速度、简单…

【MySQL数据库】详解数据库审核工具SQLE的部署及接口调用

SQLE部署及使用 1. 部署SQLE SQLE相信大家都不陌生吧&#xff0c;它是一款开源&#xff0c;支持多场景审核&#xff0c;支持标准化上线流程&#xff0c;原生支持 MySQL 审核且数据库类型可扩展的 SQL审核工具。我们可以基于此工具进行数据库SQL审核&#xff0c;提升SQL脚本质量…