很不错的一道网络流的题目

二分答案是显然的

首先不考虑每个饼干只能一个老鼠吃

那很显然的建图就是将时间点按照开始结束的点分成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]贪吃的老鼠的更多相关文章

  1. Luogu2570 [ZJOI2010]贪吃的老鼠 ---- 网络流

    Luogu2570  [ZJOI2010]贪吃的老鼠 题面描述 https://www.luogu.org/problemnew/show/P2570 然后题意大概就是m只老鼠,然后吃n个奶酪,已知 ...

  2. Luogu P2570 [ZJOI2010]贪吃的老鼠

    Luogu P2570 [ZJOI2010]贪吃的老鼠 题目描述 奶酪店里最近出现了\(m\)只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产\(n\)块奶酪,其中第\(i\)块的 ...

  3. [ZJOI2010]贪吃的老鼠(网络流+建图)

    题目描述 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块奶酪,其中第i块的大小为pi,会在第ri秒被生产出来,并且必须在第di秒之前将它吃掉.第j只老鼠吃 ...

  4. [ZJOI2010]贪吃的老鼠 网络流

    ---题面--- 题解: 这是一道强题emmmm,做法非常巧妙,,,我也是看了好久大佬题解才看明白一点 首先考虑没有限制的情况,即n个老鼠可以在同一时刻吃同一块奶酪 对各个时间段拆点,连奶酪 ---& ...

  5. Luogu2570 ZJOI2010 贪吃的老鼠 二分答案+最大流

    题目链接:https://www.luogu.org/problemnew/show/P2570 题意概述: 好像没什么好概述的.....很简洁? 分析: 首先想到二分时间,转化成判定性问题,在一定时 ...

  6. 【题解】ZJOI2010贪吃的老鼠

    %%%%真的好强...看题解我都看了好久才完全明白.放一下参考的博客,谢谢神犇QAQ 1号博客    2号博客(超级赞的啦) 因为理解的过程太艰辛,所以必须记录一下这道强题:这道题目最难的两个约束就在 ...

  7. luogu P2570 [ZJOI2010]贪吃的老鼠【二分+最大流】

    首先考虑只满足第一个条件,二分答案,把过期时间加上mid之后的2n个时间离散,老鼠拆成每个时间的,第i个时间第j个老鼠为id[i][j],连接(s,i,p[i]),对于离散后时间(g[j-1]~g[j ...

  8. P2570 [ZJOI2010]贪吃的老鼠

    传送门 →_→唯一一篇能看得懂的题解---->这里 很容易想到二分+网络流,然而并没有什么卵用--出题人的思路太神了-- 首先考虑如果一块奶酪在同一时间可以被多只老鼠吃的话,该如何建图.首先不难 ...

  9. 洛谷$P2570\ [ZJOI2010]$贪吃的老鼠 网络流+二分

    正解:网络流+二分 解题报告: 传送门$QwQ$ 和上一题有点儿像,,,?$QwQ$但是比上一题要有趣很多$QwQ$ 首先把大致思路捋下?依然是.二分出每个奶酪的开始和结束时间,然后check下最大流 ...

随机推荐

  1. C# Winform继承窗体打开设计器白屏的一例解决方法

    环境VS2017 15.5.4,Win10开发过程中,发现一些窗体打开设计器会卡死白屏,另外有一些不会,(两者运行时正常),最小化vs后甚至能把工具箱连带搞黑,严重影响开发效率,经过一天多的对比研究, ...

  2. FlowLayout OnSizeChanged

    在FlowLayout里加了20个控件,当窗口变化时,改变这20个控件的宽高,结果发现在直接点最大化时, 计算不正确导致自身的滚动条出不来.把改变大小的代码直接添加Form窗口的onSizeChagn ...

  3. 20155332 2016-2017-2 《Java程序设计》第6周学习总结

    20155332 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 1.文件的读写 2.网络上传数据的基础 3.认识INputStream.OutputStre ...

  4. OpenCV入门(1)- 简介

    1.图像的表示 在计算机看来,图像只是一些亮度各异的点,一副M*N的图片可以用M*N的矩阵来表示,矩阵的值表示这个位置上像素的亮度. 一般灰度图用二维矩阵来表示,彩色(多通道)图用三维矩阵表示,大部分 ...

  5. 寻路优化(一)——二维地图上A*启发函数的设计探索

    工作中需要优化A*算法,研究了一天,最后取得了不错的效果.看网上的朋友还没有相关的研究,特此记录一下.有错误欢迎大家批评指正.如需转载请注明出处,http://www.cnblogs.com/Leon ...

  6. logback配置按天产生日志文件

    1 依赖Jar包 pom配置 也可以根据自己的版本来 <dependency> <groupId>org.slf4j</groupId> <artifactI ...

  7. Docker三要素

    一.镜像(Image) Docker镜像(Image)就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器. Docker 面向对象 镜像 类(class) 容器 实例对象 ...

  8. WGAN源码解读

    WassersteinGAN源码 作者的代码包括两部分:models包下包含dcgan.py和mlp.py, 这两个py文件是两种不同的网络结构,在dcgan.py中判别器和生成器都含有卷积网络,而m ...

  9. CrossUI SPA Builder ---- feathers API框架

    CrossUI SPA Builder:   http://www.crossui.com/ 国产?   龙博(JSLINB)AJAX框架? CrossUI SPA Builderenables de ...

  10. VS "以下文件中的行尾不一致,要将行尾标准化吗?"

    原文地址:http://www.cnblogs.com/yymn/p/6852857.html 这是由Windows和Unix不同的标准引起的...即“回车”和“换行”的问题... “回车”和“换行” ...