CF1286D LCC
时间:2021-09-06
本文章向大家介绍CF1286D LCC,主要包括CF1286D LCC使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、题目
二、解法
这道题其实很清真的啊,我怎么做不出来呢?
首先有一个 \(\tt observation\):最小碰撞只会发生在相邻两个粒子的碰撞中。
相邻两个粒子只有三种碰撞情况,我们先把它讨论出来。然后考虑枚举产生最小碰撞时间的是某个碰撞组合,导致的限制是时间比它小的碰撞组合不能选取。
设 \(f[i][0/1]\) 表示这一位向左\(/\)向右走,\(l_i[0/1][0/1]\) 表示这种碰撞组合是否不能选取,满足限制的概率:
\[f[i][1]\leftarrow p[i]\times(f[i-1][0]\cdot l_i[0][1]+f[i-1][1]\cdot l_i[1][1])
\]
\[f[i][0]\leftarrow (1-p[i])\times(f[i-1][1]\cdot l_i[0][0]+f[i-1][1]\cdot l_i[1][0])
\]
上面的转移很容易写成矩阵的形式,具体实现就是把每种碰撞组合排序,然后做动态 \(dp\) 即可,时间复杂度 \(O(n\log n)\)
三、总结
当期望题中出现最值时,是很难记录在状态里面的,那么我们直接枚举!
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int M = 100005;
const int MOD = 998244353;
#define int long long
int read()
{
int x=0,f=1;char c;
while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
int n,m,ans,a[M],b[M],p[M];
struct mat
{
int a[2][2];
mat() {memset(a,0,sizeof a);}
mat operator * (const mat &b) const
{
mat r;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
r.a[i][k]=(r.a[i][k]+a[i][j]*b.a[j][k])%MOD;
return r;
}
}tr[4*M],mt[M];
struct node
{
int l,v,p,op;
bool operator < (const node &r) const
{
return l*r.v<r.l*v;
}
}s[3*M];
int qkpow(int a,int b)
{
int r=1;
while(b>0)
{
if(b&1) r=r*a%MOD;
a=a*a%MOD;
b>>=1;
}
return r;
}
void add(int i,int l,int r,int id,mat x)
{
if(l==r)
{
tr[i]=x;
return ;
}
int mid=(l+r)>>1;
if(mid>=id) add(i<<1,l,mid,id,x);
else add(i<<1|1,mid+1,r,id,x);
tr[i]=tr[i<<1]*tr[i<<1|1];
}
signed main()
{
n=read();
for(int i=1;i<=n;i++)
{
a[i]=read();b[i]=read();
p[i]=read()*qkpow(100,MOD-2)%MOD;
}
for(int i=1;i<n;i++)
{
int l=a[i+1]-a[i];
s[++m]=node{l,b[i+1]+b[i],i+1,0};
if(b[i]<b[i+1]) s[++m]=node{l,b[i+1]-b[i],i+1,1};
if(b[i]>b[i+1]) s[++m]=node{l,b[i]-b[i+1],i+1,2};
}
for(int i=1;i<=n;i++)
{
mt[i].a[0][0]=mt[i].a[1][0]=MOD+1-p[i];
mt[i].a[0][1]=mt[i].a[1][1]=p[i];
add(1,1,n,i,mt[i]);
}
sort(s+1,s+1+m);
for(int i=1;i<=m;i++)
{
int op=s[i].op,x=s[i].p;
int val=s[i].l*qkpow(s[i].v,MOD-2)%MOD;
mat t1=mt[x],t2;
if(op==0) t2.a[1][0]=MOD+1-p[x],t1.a[1][0]=0;
if(op==1) t2.a[0][0]=MOD+1-p[x],t1.a[0][0]=0;
if(op==2) t2.a[1][1]=p[x],t1.a[1][1]=0;
add(1,1,n,x,t2);
ans=(ans+val*(tr[1].a[0][0]+tr[1].a[0][1]))%MOD;
add(1,1,n,x,t1);mt[x]=t1;
}
printf("%lld\n",ans);
}
原文地址:https://www.cnblogs.com/C202044zxy/p/15234485.html
- iOS设备唯一标识的前世今生
- python 生成内嵌式字典(dict)-案例从python提取内嵌json写入mongodb
- Golang语言打印九九乘法表
- AVFoundation 框架初探究(四)
- Data Guard跳归档恢复的实践(r9笔记第92天)
- AVFoundation 框架初探究(三)
- AVFoundation 框架初探究(二)
- 关于视图和存储过程的权限问题探究 (r9笔记第87天)
- Java基础-day08-超市购物系统总结
- AVFoundation 框架初探究(一)
- 【Go 语言社区】 HTML5 前端--数据保存实例
- crontab设置导致的服务器进程异常问题 (r10笔记第4天)
- 一条SQL语句的执行计划变化探究(r10笔记第3天)
- tensorflow(一)windows 10 python3.6安装tensorflow1.4与基本概念解读
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android用户输入自动提示控件AutoCompleteTextView使用方法
- Android自定义View实现水波纹效果
- Android如何获取系统通知的开启状态详解
- Handler实现线程之间的通信下载文件动态更新进度条
- Android下Button实现图文混排效果
- android handler.post和handler.sendMessage的区别和联系
- 3小时带你开发一款商城类小程序(零基础入门小程序系列)
- Android 隐式Intent的实例详解
- Android编程使用加速度传感器实现摇一摇功能及优化的方法详解
- 微信小程序分页加载数据~上拉加载更多~小程序云数据库的分页加载
- TextView实现跑马灯效果 就这么简单!
- Android自带emoji表情的使用方法详解
- Android EditText实现输入表情
- Android编程实现使用Intent传输包含自定义类的ArrayList示例
- EditText实现输入限制和校验功能实例代码