洛谷P6054:开门大吉

Description\text{Description}Description

P6054 开门大吉

nnn 位选手去参加节目“开门大吉”。共有 mmm 套题,每套题包含 ppp 个题目,第 iii 位选手答对第 jjj 套题中第 kkk 道的概率为 fi,j,kf_{i,j,k}fi,j,k
若一位选手答对第 iii 题,会在已得到奖励的基础上,再得到 cic_ici 元奖励。选手总是从第一道开始,按顺序答题的。
同时,为了防止过多的选手做同一套题,还有 yyy 条形如“第 iii 位选手的套题编号必须至少比第 jjj 位的大 kkk”的限制。
你需要给每一位选手分配一套题(不同选手可以相同),使得所有人的期望奖励和最小。

Solution\text{Solution}Solution

首先,我们可以简单的算出 iii 选手选套题 jjj 的期望价值 vi,jv_{i,j}vi,j
关键就在于如何表示限制。
建出 nnn 条长度为 m+1m+1m+1 的链,设链上的点为 p1...n,1..m+1p_{1...n,1..m+1}p1...n,1..m+1,连边 (S,pi,1,INF),(pi,m+1,T,INF),(pi,j,pi,j+1,vi,j)(S,p_{i,1},INF),(p_{i,m+1},T,INF),(p_{i,j},p_{i,j+1},v_{i,j})(S,pi,1,INF),(pi,m+1,T,INF),(pi,j,pi,j+1,vi,j)。断掉 (pi,j,pi,j+1,vi,j)(p_{i,j},p_{i,j+1},v_{i,j})(pi,j,pi,j+1,vi,j) 的边即表示令 iii 选手做 jjj 号题。
这样建图之后限制就容易表示了,设 iii 选手比 jjj 选手题目编号至少大 kkk,就对于所有合法的下标 xxx,均连边 (pj,x,pi,x+k,INF)(p_{j,x},p_{i,x+k},INF)(pj,x,pi,x+k,INF) 即可。

但是这样是无法通过本题的。主流题解都说还需要加上 (pi,j+1,pi,j,INF)(p_{i,j+1},p_{i,j},INF)(pi,j+1,pi,j,INF) 的边,以实现限制的传递性(或者说保证每条链只断一条边),但我认为这并不是问题的本质,这个连边方法并不是必须的,实践结果也证明了这一点。
我们来看看原来的做法到底为什么出错。
原来的连边方式其实是很健全的,它本身已经有了传递性,如:
请添加图片描述红线和绿线限制已经可以进行传递,形成黄色的限制。
那么为什么我们难以通过一些测试点呢?
因为我们的限制没有加全!
题解和我一开始的写法对于限制的加边一般都是写成类似下边的形式:

for(int j=max(1,1-k);j<=m+1&&j+k<=m+1;j++) add(id[y][j],id[x][j+k],inf);

但正确的写法应该是:

for(int j=max(1,1-k);j<=m+1;j++) add(id[y][j],id[x][min(j+k,m+1)],inf);

这两个具象一下就是下面两张图的差别:
请添加图片描述请添加图片描述
注意到,在第一种加法中,后面的两个点没有被限制,成了“法外之地”,这也是为什么加完反向边可以把这个问题修正的原因。
即使可以这么修正,但从问题的本质来看还是不够优美的。因此,建议直接把加限制边的方式修改,而不是进行侧面的修正。

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=2e5+100;
const int M=2e6+100;
const double inf=1e11;
const double eps=1e-6;int n,m,num,y;
int flag;int tot,s,t;
struct node{int to,nxt;double cap;
}p[M<<1];
int fi[N],cur[N],cnt;
inline void addline(int x,int y,double c){p[++cnt]=(node){y,fi[x],c};fi[x]=cnt;
}
inline void add(int x,int y,double c){//printf("%d->%d cap=%.2lf\n\n",x,y,c);addline(x,y,c);addline(y,x,0);
}
int bel[N];
queue<int>que;
int bfs(){fill(bel,bel+1+tot,0);bel[s]=1;que.push(s);while(!que.empty()){int now=que.front();que.pop();for(int i=cur[now]=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(p[i].cap<eps||bel[to]) continue;bel[to]=bel[now]+1;que.push(to);}}return bel[t];
}
double dfs(int x,double lim){if(x==t||lim<eps) return lim;double res(0);for(int &i=cur[x];~i;i=p[i].nxt){int to=p[i].to;if(bel[to]!=bel[x]+1) continue;double add=dfs(to,min(lim,p[i].cap));res+=add;lim-=add;p[i].cap-=add;p[i^1].cap+=add;//printf("x=%d to=%d add=%lf\n",x,to,add);if(lim<eps) break;}if(res<eps) bel[x]=-1;return res;
}
void dinic(){double flow(0),tmp(0);while(bfs()){while((tmp=dfs(s,inf))>eps) flow+=tmp;if(flow>=inf){puts("-1");return;}}printf("%lf\n",flow);return;
}
int id[90][90];
int c[90];
double ans;
double f[90][90][90],pp[90][90][90],val[90][90];
void init(){ans=0;tot=0;for(int i=1;i<=n;i++){for(int j=1;j<=m+1;j++) id[i][j]=++tot;}s=++tot;t=++tot;memset(fi,-1,sizeof(fi));cnt=-1;
}
void calc(){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){pp[i][j][0]=1;val[i][j]=0;for(int k=1;k<=num;k++) pp[i][j][k]=pp[i][j][k-1]*f[i][j][k];for(int k=1;k<=num;k++){pp[i][j][k]=pp[i][j][k]*(1-f[i][j][k+1]);val[i][j]+=pp[i][j][k]*c[k];}//printf("i=%d j=%d val=%lf\n",i,j,val[i][j]);}}
}void work(){n=read();m=read();num=read();y=read();init();for(int i=1;i<=num;i++) c[i]=read()+c[i-1];for(int j=1;j<=m;j++){for(int i=1;i<=n;i++){for(int k=1;k<=num;k++) scanf("%lf",&f[i][j][k]);}}calc();for(int i=1;i<=n;i++){add(s,id[i][1],inf);add(id[i][m+1],t,inf);for(int j=1;j<=m;j++){add(id[i][j],id[i][j+1],val[i][j]);//add(id[i][j+1],id[i][j],inf);}}for(int i=1;i<=y;i++){int x=read(),y=read(),k=read();for(int j=max(1,1-k);j<=m+1;j++) add(id[y][j],id[x][min(j+k,m+1)],inf);}dinic();return;
}
signed main(){#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);#endifint T=read();while(T--) work();return 0;
}
/*
1
3 2 4 1
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
2 3 1
*/

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

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

相关文章

Docker最全教程之Ubuntu下安装Docker(十五)

前言Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统&#xff0c;应用很广。本篇主要讲述Ubuntu下使用SSH远程登录并安装Docker&#xff0c;并且提供了Docker安装的两种方式&#xff0c;希望对大家有所帮助。拥抱Linux&#xff0c;大家可以从Ubuntu开始&#xff01;Ubuntu下…

潘淳(寒树Office):不务正业的公众号满月了,都写了些啥?

三喜临门一 喜今天真是个好日子&#xff0c;“流浪太阳”又回来了&#xff0c;阴雨绵绵长恨无期&#xff0c;今天苏州终于天晴&#xff0c;于是心情大好&#xff01;都说好心情会带来好运气&#xff0c;冥冥感觉要写点啥了&#xff0c;果不其然今天还有另外两喜。大早起来得…

G List it all

传送 题意&#xff1a; 题解&#xff1a; 我们来考虑以下样例&#xff1a;1&#xff0c;1&#xff0c;2 我们先考虑1的贡献&#xff1a;如图(图中只花了) 2&#xff01;表示还剩两个空位&#xff0c;还有两个数未填入&#xff0c;所以是2&#xff01;个 对于n个数重复&#x…

ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

一、前言在非静态页面的项目开发中&#xff0c;必定会涉及到对于数据库的访问&#xff0c;最开始呢&#xff0c;我们使用 Ado.Net&#xff0c;通过编写 SQL 帮助类帮我们实现对于数据库的快速访问&#xff0c;后来&#xff0c;ORM&#xff08;Object Relational Mapping&#x…

微软发布 Visual Studio 2019年第二季度路线图

微软近日发布了 Visual Studio 2019 年第二季度的路线图&#xff0c;路线图介绍了目前 VS 致力于在 VS 2019 发布的一些重要功能。官方表示&#xff0c;Visual Studio 2019 将继续按照 Visual Studio 发行周期流程提供更新&#xff0c;也就是约每 6 周推出一次次要更新&#xf…

李争——一个骨子里是极客的程序员

我的业余作品《IT 英雄传》&#xff0c;聚焦身边的英雄&#xff0c;以文字采访的形式记录奇人趣事&#xff0c;笑看风云变幻。所写的人都是我见过面且比较熟悉的&#xff0c;绝大部分都是交往很久的&#xff0c;其中为了避嫌&#xff0c;我很少写微软同事&#xff0c;但今天这一…

仅此一文让你明白事务隔离级别、脏读、不可重复读、幻读

网络上关于这方面的博文有些偏理论&#xff0c;有些通篇代码&#xff0c;都不能深入浅出。本文用图文并茂的方式&#xff0c;配上行云流水般的代码&#xff0c;非要摆清楚这个问题。相关代码已提交至码云&#xff08;点击这里下载&#xff09;。事务是现代关系型数据库的核心之…

2.5:模拟总结

文章目录前言考场题目解析T1T2T3总结代码T1T2T3前言 50pts 30020 rnk19 … 把1000ms看成10s我也真是个人才。 T3自然溢出50带模数T成20有点离谱。 但倒没有因为WA失分。 就是菜罢了 考场 这次时间管理还是比较合理的。 乍看三题觉得T1似乎是个伞兵题 这离线下来可持久化数组…

Meeting HDU - 5521

Meeting HDU - 5521 题意&#xff1a; 一共有n个点&#xff0c;有m个块&#xff0c;每个块内有Si个点&#xff0c;块内点彼此到达费用为wi&#xff0c;两个人分别位于1和n号块&#xff0c;两者同时出发问最短时间遇到是多少&#xff1f;在哪些地方可以遇到&#xff1f; ΣSi&…

牛客IOI周赛26-提高组(逆序对,对序列,未曾设想的道路) 题解

文章目录逆序对对序列未曾设想的道路牛客IOI周赛26-提高组逆序对 这种套路之前已经见过几次了&#xff0c;肯定不是模拟操作数列 opt 1 对于i∈[1,l)⋃(r,n]i∈[1,l)\bigcup(r,n]i∈[1,l)⋃(r,n] 逆序对是不影响的 对于i∈(l,r)i∈(l,r)i∈(l,r) 与l/rl/rl/r的情况会反转&…

Frogs HDU - 5514

Frogs HDU - 5514 题意&#xff1a; 有n个青蛙&#xff0c;第 i 个青蛙每次只能够跳 ai​步&#xff0c;现在有m个石头围成一圈&#xff0c;编号为0到m−1&#xff0c;现在青蛙可以围着这个石头组成的圆跳无限次&#xff0c;每跳一次就会占领这个石头&#xff0c;可以无限占领…

Docker最全教程之树莓派和Docker(十六)

前言树莓派&#xff08;Raspberry Pi&#xff09;是一台卡片电脑&#xff08;只有信用卡大小&#xff09;&#xff0c;我们可以使用树莓派做很多事情&#xff0c;比如智能家居的中控、航空器、BT下载器、挖矿机、智能机器人、小型服务器&#xff08;花生壳网站&#xff09;等等…

【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置

介绍系列目录&#xff1a;【NET CORE微服务一条龙应用】开始篇与目录在微服务的应用中&#xff0c;统一的认证授权是必不可少的组件&#xff0c;本文将介绍微服务中网关和子服务如何使用统一的权限认证主要介绍内容为&#xff1a;1、子服务如何实现和网关相同的鉴权方式2、接口…

WebApiClient与Asp.net core DI的结合

1 WebApiClient一款基于HttpClient封装&#xff0c;只需要定义c#接口并修饰相关特性&#xff0c;即可异步调用远程http接口的客户端库WebApiClientWebApiClient.ExtensionsWebApiClient.Tools2 Http接口的注册与提供2.1 声明远程端http接口public interface IBaiduApi : IHttpA…

梁迪:源于热爱乐于分享,MVP代表圆桌会议

梁迪《MVP代表圆桌会议》MVP代表圆桌会议&#xff0c;源于热爱乐于分享。来自全国的MVP&#xff08;周岳、苏震巍、蒋金楠、胡浩、卿毅、项斌、刘浩杨、施兆熊、方洁影、方骥、刘鑫、童广林&#xff09;作经验交流。梁 迪微软最有价值专家&#xff08;MVP&#xff09;项目大…

基于xlua和mvvm的unity框架

1、框架简介这两天在Github上发现了xlua的作者车雄生前辈开源的一个框架—XUUI&#xff0c;于是下载下来学习了一下。XUUI基于xlua&#xff0c;又借鉴了mvvm的设计概念。xlua是目前很火的unity热更方案&#xff0c;不仅支持纯lua脚本热更&#xff0c;也可以做 C# 代码的bug hot…

如何在ASP.NET Core中使用JSON Patch

原文&#xff1a; JSON Patch With ASP.NET Core作者&#xff1a;.NET Core Tutorials译文&#xff1a;如何在ASP.NET Core中使用JSON Patch地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10433615.html译者&#xff1a;Lamond LuJSON Patch是一种使用API显式更新文档的方…

.NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接

众所周知在.NET下的RSA类所生成的密钥为Xml格式&#xff0c;而其他语言比如java一般使用pkcs8格式的密钥&#xff0c;JavaScript一般使用pkcs1格式。我们在开发过程中很可能遇到需要与其他语言开发的api进行对接&#xff0c;如果遇到RSA加密解密&#xff0c;我们肯定需要保证ke…

ABP VNext 微服务演示,项目状态和路线图

在ABP vNext上的第一个公告之后,我们对代码库进行了很多改进(GitHub存储库上的1100多次提交).我们已经创建了功能,示例,文档等等.在这篇文章中,我想告诉你一些新闻和项目的状态.ABP微服务演示解决方案ABP框架的主要目标之一是提供创建微服务解决方案的便利基础设施.我们一直在努…

[aspnetcore.apidoc]一款很不错的api文档生成工具

简单徐速一下为什么选用了aspnetcore.apidoc 而没有选用swagger最初我们也有在试用swagger&#xff0c;但总是有些感觉&#xff0c;感觉有点不满意&#xff0c;就但从api文档角度来说&#xff0c;从前后端文档沟通角度来讲apidoc的表现形式&#xff0c;要比swagger简单的多&…