[ZJOI2010]贪吃的老鼠
很不错的一道网络流的题目
二分答案是显然的
首先不考虑每个饼干只能一个老鼠吃
那很显然的建图就是将时间点按照开始结束的点分成2*n-1段
然后对每一段时间建m个老鼠的点,然后s-它限流,再从它到目前可以运行的饼干
那么考虑加上限制每个饼干只能被一个老鼠吃
我们可以考虑一下进行差分
将s-老鼠的值变成差分后的值(当然还得乘以相应个数) 同理老鼠到饼干也类似的连(就不用乘以相应个数了)
为什么这样做是可以的呢?
因为 我们可以把每一个决策都用这里差分的值来表示出来
那还有一个问题就是有的状态实际上是看似不存在的
比如有v1,v2,v3
那么如果没有v2-v1,v1只有v3-v2这个状态实际是不存在的
但是这个一定是比v3状态吃的要小的,即用比限制时间少的v3是一定能达到这个状态的
所以这个是对的
另外:由于几乎没用过c++实数的原因 被坑的很惨
刚开始以为是eps出问题导致精度不足。。后来发现对于精度要求高这不能用cout
long double在精度上高于double
输出时要转换成double输出
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=;
#define INF 1e9
#define exp 1e-6
ll n,m,s,t,l,sum;
ll head[maxn],d[maxn],p[maxn],r[maxn];
ll dd[maxn],ss[maxn];
bool vis[maxn];
struct re{
ll a,b;
long double c,flow;
}a[maxn];
void arr(ll x,ll y,long double z)
{
a[++l].a=head[x];
a[l].b=y;
a[l].c=z;
a[l].flow=;
head[x]=l;
}
bool bfs()
{
memset(vis,,sizeof(vis));
queue<ll> q;
q.push(s);
d[s]=; vis[s]=;
while (!q.empty())
{
ll x=q.front();q.pop();
ll u=head[x];
while (u)
{
ll v=a[u].b;
if (!vis[v]&&a[u].c>a[u].flow)
{
vis[v]=;
d[v]=d[x]+;
q.push(v);
}
u=a[u].a;
}
}
return vis[t];
}
long double dfs(ll x,long double y)
{
if (x==t||y==) return y;
long double flow=,f;
ll tmp;
ll u=head[x];
while (u)
{
ll v=a[u].b;
if (d[x]+==d[v]&&(f=dfs(v,min(y,a[u].c-a[u].flow)))>)
{
a[u].flow+=f;
if (u%) tmp=u+; else tmp=u-;
y-=f;
a[tmp].flow-=f;
flow+=f;
if (y==) break;
}
u=a[u].a;
}
return flow;
}
long double maxflow()
{
long double flow=;
while (bfs())
{
flow+=dfs(s,INF);
}
return flow;
}
struct ree{
long double a;
ll b;
}b[maxn];
bool cmp(ree a,ree b)
{
return(a.a<b.a);
}
bool cmp2(ll x,ll y)
{
return(x<y);
}
bool check(long double x)
{
for (ll i=;i<=n;i++)
{
b[i*-].a=r[i]; b[i*].a=dd[i]+x;
b[i*].b=i*; b[i*-].b=i*-;
}
sort(b+,b+*n+,cmp);
l=;memset(head,,sizeof(head));
ll last2=;
s=; t=(*n-)*m+n+;
for (ll i=;i<=n;i++)
{
arr((*n-)*m+i,t,p[i]);
arr(t,(*n-)*m+i,);
}
for (ll i=;i<=*n-;i++)
{
for (ll j=;j<=m;j++)
{
arr(,j+last2,(m-j+)*(ss[j]-ss[j-])*(b[i+].a-b[i].a));
arr(j+last2,,);
}
for (ll k=;k<=n;k++)
if (r[k]<=b[i].a&&dd[k]+x>=b[i+].a)
for (ll j=;j<=m;j++)
{
arr(j+last2,(*n-)*m+k,(b[i+].a-b[i].a)*(ss[j]-ss[j-]));
arr((*n-)*m+k,j+last2,);
}
last2+=m;
}
ll to=maxflow();
if (to==sum) return();
else return ();
}
int main()
{
freopen("cheese.in","r",stdin);
freopen("cheese.out","w",stdout);
ll T;
cin>>T;
for (ll i=;i<=T;i++)
{
cin>>n>>m; sum=;
for (ll i=;i<=n;i++)
{
cin>>p[i]>>r[i]>>dd[i];
sum+=p[i];
}
for (ll i=;i<=m;i++)
cin>>ss[i];
sort(ss+,ss+m+,cmp2);
long double hh=,tt=1e9;
while ((tt-hh)>exp)
{ long double mid=(hh+tt)/;
if (check(mid)) tt=mid; else hh=mid;
}
double tmp=tt;
printf("%.9f\n",tmp);
}
return ;
}
[ZJOI2010]贪吃的老鼠的更多相关文章
- Luogu2570 [ZJOI2010]贪吃的老鼠 ---- 网络流
Luogu2570 [ZJOI2010]贪吃的老鼠 题面描述 https://www.luogu.org/problemnew/show/P2570 然后题意大概就是m只老鼠,然后吃n个奶酪,已知 ...
- Luogu P2570 [ZJOI2010]贪吃的老鼠
Luogu P2570 [ZJOI2010]贪吃的老鼠 题目描述 奶酪店里最近出现了\(m\)只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产\(n\)块奶酪,其中第\(i\)块的 ...
- [ZJOI2010]贪吃的老鼠(网络流+建图)
题目描述 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块奶酪,其中第i块的大小为pi,会在第ri秒被生产出来,并且必须在第di秒之前将它吃掉.第j只老鼠吃 ...
- [ZJOI2010]贪吃的老鼠 网络流
---题面--- 题解: 这是一道强题emmmm,做法非常巧妙,,,我也是看了好久大佬题解才看明白一点 首先考虑没有限制的情况,即n个老鼠可以在同一时刻吃同一块奶酪 对各个时间段拆点,连奶酪 ---& ...
- Luogu2570 ZJOI2010 贪吃的老鼠 二分答案+最大流
题目链接:https://www.luogu.org/problemnew/show/P2570 题意概述: 好像没什么好概述的.....很简洁? 分析: 首先想到二分时间,转化成判定性问题,在一定时 ...
- 【题解】ZJOI2010贪吃的老鼠
%%%%真的好强...看题解我都看了好久才完全明白.放一下参考的博客,谢谢神犇QAQ 1号博客 2号博客(超级赞的啦) 因为理解的过程太艰辛,所以必须记录一下这道强题:这道题目最难的两个约束就在 ...
- luogu P2570 [ZJOI2010]贪吃的老鼠【二分+最大流】
首先考虑只满足第一个条件,二分答案,把过期时间加上mid之后的2n个时间离散,老鼠拆成每个时间的,第i个时间第j个老鼠为id[i][j],连接(s,i,p[i]),对于离散后时间(g[j-1]~g[j ...
- P2570 [ZJOI2010]贪吃的老鼠
传送门 →_→唯一一篇能看得懂的题解---->这里 很容易想到二分+网络流,然而并没有什么卵用--出题人的思路太神了-- 首先考虑如果一块奶酪在同一时间可以被多只老鼠吃的话,该如何建图.首先不难 ...
- 洛谷$P2570\ [ZJOI2010]$贪吃的老鼠 网络流+二分
正解:网络流+二分 解题报告: 传送门$QwQ$ 和上一题有点儿像,,,?$QwQ$但是比上一题要有趣很多$QwQ$ 首先把大致思路捋下?依然是.二分出每个奶酪的开始和结束时间,然后check下最大流 ...
随机推荐
- buildroot构建项目(二)--- u-boot 2017.11 建立 2440 开发板
一.准备工作 在建立之前,先需要将下载的u-boot 拷贝一份出来解压,在此工程下进行更改和创建.同时根据前面搜索到的 mini2440开发板所在的版本,下载一份u-boot 拷贝出 mini2440 ...
- pandas数据表
安装 pip3 install pandas s=pd.Series([1,3,6,90,44,1]) #创建序列[用列表创建].数据源的维度必须是一维 #data 指定数据源 print(s ...
- JavaScript之字符串匹配工具[插件]
/*** * StringCheckUtil * 字符串检测工具 * * @version 1.0 * @method isNum(string,scope) * @method isChinese( ...
- HashMap、ArrayMap、SparseArray分析比较
http://blog.csdn.net/chen_lifeng/article/details/52057427
- ROS 时间同步问题
0. 问题 两台ubuntu主机无法与一台debian主机使用分布式通信,摄像头发出的话题机器人收不到,考虑是时间同步的问题. 也可能是系统不统一的问题; 今天在家实验了一下,时间差6min,照样可以 ...
- ubuntu14.04 提示 卷 文件系统根目录 仅剩余xxx的硬盘空间
- AWTK(Toolkit AnyWhere): 为嵌入式、手机和桌面开发的通用GUI【转】
转自:https://blog.csdn.net/absurd/article/details/80958279 AWTK = Toolkit AnyWhere AWTK是吸取了FTK和CanTK的精 ...
- 通过htaccess文件配置多个一级域名指向根目录的子文件夹
创建.htaccess文件,在Windows系统创建时要写成“.htaccess.”,不带双引号,否则不会创建成功. <IfModule mod_rewrite.c> Options +F ...
- C# 多种方式连接Oracle。
废话不多说直接正题: 首先我们先在Oracle数据库下建了一个用户叫做lisi,密码为lisi,在这个用户下建立一张表叫做“USERS”,在这个表下新增三个数据. 方式一:利用OleDb连接Oracl ...
- Ext需要的文件目录
使用ext版本信息:ext-4.1.1a <!-- 下面是引入文件需要导入的文件信息 ext-all.css ext-all.js --><link rel="styles ...