[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下最大流 ...
随机推荐
- Jacob用法收集
介绍 Jacob 是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调 ...
- 使用ResourceBundle读取配置文件
在Java语言中,使用一种以.properties为扩展名的文本文件作为资源文件,该类型的文件的内容格式为类似: 12 #注释语句 some_key=some_value 形式.以#开头的行作为注释行 ...
- Nginx Server 配置
http { include mime.types; // 主模块:实现对配置文件包含的文件设定,可以减少主配置文件的复杂度: default_type application/octet-strea ...
- Linux - 进程服务资源
1.进程查看操作管理 ps -eaf # 查看所有进程 kill - PID # 强制终止某个PID进程 kill - PID # 安全退出 需程序内部处理信号 cmd & # 命令后台运行 ...
- Python之Eclipse环境下安装与配置
奔着对python的好奇,今天又是周末,欲小试Python.那么首先避不开的问题就是python的环境搭建.而我之前已经在学习Java的过程中安装了Eclipse,不想再安装更多的IDE了,就那Ecl ...
- IO流总结笔记二
Reader |--InputStreamReader |--FileReader:专门用于处理文件的字符读取流对象 Writer |--OutputStreamWriter |--FileWri ...
- B. Planning The Expedition
题目链接:http://codeforces.com/contest/1011/problem/B 题目大意: 输入的n,m代表n个人,m个包裹. 标准就是 每个人一开始只能选定吃哪一个包裹里的食物, ...
- Caffe2 Detectron安装错误记录
caffe2 caffe2的安装方法有几种.其中最方便的是conda install.但是要求必须安装Anaconda. conda install -c caffe2 caffe2-cuda8.0- ...
- iptables学习笔记_____摘自朱双印个人日志 ____http://www.zsythink.net/
iptables为我们预先定义了四张表 raw.mangle.nat.filter filter表负责过滤:允许那些ip访问.拒绝那些ip访问.允许那些端口...是最常用的表 #查看表里面所有的规则i ...
- D3开发中的资料整理
D3开发台阶比较高,需要对html,css,js非常熟练,还要对SVG非常熟悉,SVG不会就不要开发D3了,下面给大家推荐一本资料,为大家未来的开发提供便利. 这个框架产品不支持ie8,是这个产品的特 ...