P6054 [RC-02] 开门大吉 题解

news/2025/2/11 8:31:15/文章来源:https://www.cnblogs.com/Charlieljk/p/18709074

写在前面

先提供一组 hack 数据:

2
3 2 4 2
10 10 10 20
0.3 0.5 0.7 0.4
0.2 0.6 0.2 0.2
0.7 0.1 0.8 0.2
0.5 0.5 0.5 0.5
0.2 0.5 0.3 0.6
0.3 0.5 0.4 0.1
1 2 1
2 3 1
9 3 1 1
36 
0.6 
0.7 
0.1 
0.3 
0.3 
0.9 
0.9 
0.2 
0.9 
0.1 
0.3 
0.9 
0.1 
0.7 
0.6 
0.3 
0.7 
0.8 
0.4 
0.5 
0.5 
0.5 
0.1 
0.5 
0.5 
0.3 
0.5 
3 5 1

正确输出:

-1
100.800000

此数据 hack 掉了以下两篇题解:

  • https://www.luogu.com.cn/article/rtokwzol
  • https://www.luogu.com.cn/article/l3dxtw40

均为清空问题,未将 \(f_{i,j,p+1}\) 赋为 \(0\) 导致第二个结果不正确,更改后即可通过。

上面两篇题解讲的还是不错的,建议不必撤下,但是第一篇甚至是一楼,所以对拍的时候要小心(做题时拍了半天都对不上结果交上去过了),而以上题解均可通过猜测是因为数据中不存在后面的 \(p\) 小于前面的 \(p\) 的情况。

多倍经验:P3227 [HNOI2013] 切糕。

思路

一个选手必须且只能选择一套题,所以可以直接求出选手 \(i\) 答第 \(j\) 套题时的期望:

\[val_{i,j}=\sum_{k=1}^{p}(\prod_{h=1}^{k}f_{i,j,h})\times (1-f_{i,j,k+1})\times \sum_{h=1}^{k}c_h \]

考虑没有限制时,只需对于每个选手链接一条长度为 \(m+1\) 的链跑最小割即可,具体的,连接 \(s\xrightarrow{inf} (i,1),(i,m)\xrightarrow{val_{i,m}} t,(i,j)\xrightarrow[j\in [1,m)]{val_{i,j}} (i,j+1)\)

加入限制时,还需引入一个新的节点 \((i,m+1)\),于是变成了连接 \(s\xrightarrow{inf} (i,1),(i,m+1)\xrightarrow{inf} t,(i,j)\xrightarrow[j\in\text{[1,m]}]{val_{i,j}} (i,j+1)\),后面讲为什么要这么做。

对于每一条限制,连接 \((j,h)\xrightarrow[h\in \text{[max(1,i-k),m]}]{inf}(i,\min(h+k,m+1))\) 这样一条无法割开的边,此时如果选择不符合规范时其依然可以从这天边流过去到达 \(t\)

那么 \((i,m+1)\) 的作用就凸显出来了,我们不能让 \(h+k>m\) 的成为法外狂徒,同时还避免了 \(p=1\) 时的一些不必要的麻烦。

最后跑一遍最小割就好了。

一些细节

  1. 首先这道题是多测,所以注意清空问题,不光是建图需要清空,还有「写在前面」中提到的 \(f_{i,j,p+1}=0\) 的问题。

  2. 注意 \(k\) 可能是负数,所以对于限制建边 \(h\) 不一定从 \(1\) 开始。

  3. 因为是浮点数,所以注意精度问题,要开 eps。

  4. 对于判断无解,当流量 \(\ge inf\) 时就是无解了。

代码

#include<bits/stdc++.h>
#define ll long long
#define mkp make_pair
using namespace std;
const int N=6510,M=2e5+10,inf=0x3f3f3f3f; const double eps=1e-8;
#ifdef __linux__
#define gc getchar_unlocked
#define pc putchar_unlocked
#else
#define gc _getchar_nolock
#define pc _putchar_nolock
#endif
inline bool blank(const char x) {return !(x^32)||!(x^10)||!(x^13)||!(x^9);}
template<typename Tp> inline void read(Tp &x) {x=0; register bool z=true; register char a=gc(); for(;!isdigit(a);a=gc()) if(a=='-') z=false; for(;isdigit(a);a=gc()) x=(x<<1)+(x<<3)+(a^48); x=(z?x:~x+1);}
inline void read(double &x) {x=0.0; register bool z=true; register double y=0.1; register char a=gc(); for(;!isdigit(a);a=gc()) if(a=='-') z=false; for(;isdigit(a);a=gc()) x=x*10+(a^48); if(a!='.') return x=z?x:-x,void(); for(a=gc();isdigit(a);a=gc(),y/=10) x+=y*(a^48); x=(z?x:-x);}
inline void read(char &x) {for(x=gc();blank(x)&&(x^-1);x=gc());}
inline void read(char *x) {register char a=gc(); for(;blank(a)&&(a^-1);a=gc()); for(;!blank(a)&&(a^-1);a=gc()) *x++=a; *x=0;}
inline void read(string &x) {x=""; register char a=gc(); for(;blank(a)&&(a^-1);a=gc()); for(;!blank(a)&&(a^-1);a=gc()) x+=a;}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y) {read(x),read(y...);}
template<typename Tp> inline void write(Tp x) {if(!x) return pc(48),void(); if(x<0) pc('-'),x=~x+1; register int len=0; register char tmp[64]; for(;x;x/=10) tmp[++len]=x%10+48; while(len) pc(tmp[len--]);}
inline void write(const double x) {register int a=6; register double b=x,c=b; if(b<0) pc('-'),b=-b,c=-c; register double y=5*powl(10,-a-1); b+=y,c+=y; register int len=0; register char tmp[64]; if(b<1) pc(48); else for(;b>=1;b/=10) tmp[++len]=floor(b)-floor(b/10)*10+48; while(len) pc(tmp[len--]); pc('.'); for(c*=10;a;a--,c*=10) pc(floor(c)-floor(c/10)*10+48);}
inline void write(const pair<int,double>x) {register int a=x.first; if(a<7) {register double b=x.second,c=b; if(b<0) pc('-'),b=-b,c=-c; register double y=5*powl(10,-a-1); b+=y,c+=y; register int len=0; register char tmp[64]; if(b<1) pc(48); else for(;b>=1;b/=10) tmp[++len]=floor(b)-floor(b/10)*10+48; while(len) pc(tmp[len--]); a&&(pc('.')); for(c*=10;a;a--,c*=10) pc(floor(c)-floor(c/10)*10+48);} else cout<<fixed<<setprecision(a)<<x.second;}
inline void write(const char x) {pc(x);}
inline void write(const bool x) {pc(x?49:48);}
inline void write(char *x) {fputs(x,stdout);}
inline void write(const char *x) {fputs(x,stdout);}
inline void write(const string &x) {fputs(x.c_str(),stdout);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y) {write(x),write(y...);}
int T,n,m,h,d,s,t,a[85],dep[N],now[N];
int tot=1,head[N],nxt[M],to[M]; double ans,f[85],p[85],w[M];
inline int id(int x,int y) {return (x-1)*(m+1)+y;}
inline void add(int x,int y,double z)
{nxt[++tot]=head[x],to[head[x]=tot]=y,w[tot]=z;nxt[++tot]=head[y],to[head[y]=tot]=x,w[tot]=0;
}
inline bool bfs()
{queue<int>q; memset(dep,0x3f,sizeof(dep));for(memcpy(now,head,sizeof(now)),q.push(s),dep[s]=0;!q.empty();){int x=q.front(); q.pop();for(int i=head[x],y;y=to[i];i=nxt[i]) if(w[i]>eps&&dep[y]==inf){dep[y]=dep[x]+1,q.push(y); if(y==t) return true;}} return false;
}
inline double dfs(int x,double sum)
{if(x==t||sum<eps) return sum; double sur,res=0;for(int &i=now[x],y;y=to[i];i=nxt[i]) if(w[i]>eps&&dep[y]==dep[x]+1){if((sur=dfs(y,min(sum,w[i])))<eps) {dep[y]=inf; continue;}w[i]-=sur,w[i^1]+=sur,res+=sur; if((sum-=sur)<eps) break;} return res;
}
signed main()
{for(p[0]=1,read(T);T--;tot=1,memset(head,0,sizeof(head))){read(n,m,h,d),t=(s=id(n,m+1)+1)+1,ans=0,f[h+1]=0;for(int i=1;i<=h;i++) read(a[i]),a[i]+=a[i-1];for(int i=1,j,k;i<=m;i++) for(j=1;j<=n;j++){double x=0; for(k=1;k<=h;k++) read(f[k]),p[k]=p[k-1]*f[k];for(k=1;k<=h;k++) x+=p[k]*(1-f[k+1])*a[k];add(id(j,i),id(j,i+1),x);}for(int i=1;i<=n;i++) add(s,id(i,1),inf),add(id(i,m+1),t,inf);for(int i,j,k,o;d--;) for(read(i,j,k),o=max(1,1-k);o<=m;o++)add(id(j,o),id(i,min(o+k,m+1)),inf);while(bfs()&&inf-ans>eps) ans+=dfs(s,inf);inf-ans<eps?write("-1\n"):write(ans,'\n');}
}

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

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

相关文章

开源的 DeepSeek-R1「GitHub 热点速览」

春节假期回来,一睁眼全是王炸级的开源模型 DeepSeek-R1!GitHub 地址→github.com/deepseek-ai/DeepSeek-R1DeepSeek-R1 开源还不到一个月,Star 数就飙升至冲破天际的 70k。虽然目前仅开源了模型权重,但同时发布的技术论文详细地介绍了 DeepSeek-R1 所采用的训练技术,如模型…

C#/.NET/.NET Core优秀项目和框架2025年1月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的详细介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附…

Palo Alto Cortex XSOAR 6.13 for Linux - 安全编排、自动化和响应 (SOAR) 平台

Palo Alto Cortex XSOAR 6.13 for Linux - 安全编排、自动化和响应 (SOAR) 平台Palo Alto Cortex XSOAR 6.13 for Linux - 安全编排、自动化和响应 (SOAR) 平台 Security Orchestration, Automation and Response (SOAR) platform 请访问原文链接:https://sysin.org/blog/cort…

2025年01月总结及随笔之年前撞车

2025年01月总结及随笔之年前撞车1. 回头看 日更坚持了762天。读《数据保护:工作负载的可恢复性》更新完成 读《量子霸权》开更并更新完成 读《算法简史:从美索不达米亚到人工智能时代》开更并持续更新2023年至2025年01月底累计码字1936092字,累计日均码字2540字。 2025年01月…

[网络] 跨域问题及解决方案

同源策略及跨域问题 同源策略是一套浏览器安全机制,当一个源的文档和脚本,与另一个源的资源进行通信时,同源策略就会对这个通信做出不同程度的限制。 简单来说,同源策略对 同源资源 放行,对 异源资源 限制 因此限制造成的开发问题,称之为跨域(异源)问题 同源和异源 源(…

macos安装三方windows

mac需时intel芯 m芯片貌似不支持windows系统,甚至虚拟机的方式都支持不友好 准备好鼠标 因为在windows安装界面或第一次打开的系统时,此时时没有注入驱动的,macbook笔记本自带的键盘触摸板将都不可用! 格式必须是iso 如果你下载到的三方windows系统是esd 或者其他格式,则必…

[大模型/AI/GPT] Chatbox:大模型可视化终端应用

序 概述:Chatbox AIChatbox AI 是一款 AI 客户端应用和智能助手,支持众多先进的 AI 模型和 API,可在 Windows、MacOS、Android、iOS、Linux 和网页版上使用。User-friendly Desktop Client App for AI Models/LLMs (GPT, Claude, Gemini, Ollama...)https://github.com/Bin-…

【AI安全】大模型越狱探索

本文皆在探讨大模型越狱攻击手法,能实操落地非学术化的,所有案例用于技术分享交流,在后文中尽量会用最精简的语言来讲解 开篇点题:越狱追溯于早期 IOS,用户为了突破设备的封闭生态系统,自由操作自己的IOS,不被限制,而在大模型中,越狱同理,规避大模型的限制,执行那些…

【洛谷P1229】遍历问题

这道题好巧 遍历问题 题目描述 我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历,你…

第二课 经济金融案例实战

目录导入数据并观察合并数据提取出标签并对标签进行处理合并训练集和测试集变量转化正确化变量属性对分类型特征进行独热编码填写数值型特征的缺失值标准化数值型特征建立模型分出训练集和测试集集成提交结果 导入数据并观察 合并数据这里可能有个问题。我们说不要让模型提前见…

STM32学习笔记【电赛历险记嵌入式学习心得】

关于STM32F103C8T6的学习笔记,除基础介绍外,包含标准库与HAL库,涉及蓝牙、电机、超声波、红外等模块,涉及GPIO、中断、定时器、IC输入捕获、ADC、DMA等基础模块,含有CubeMX学习,C语言预编译知识,含有推荐学习项目链接。前言 此篇随笔是博主在打电赛(全国大学生电子设计…

【K8S安全】浅析K8S各种未授权攻击方法

免责声明: 本篇文章仅用于技术交流,请勿利用文章内的相关技术从事非法测试,由于传播、利用本文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢…