正解:网络流+二分

解题报告:

传送门$QwQ$

和上一题有点儿像,,,?$QwQ$但是比上一题要有趣很多$QwQ$

首先把大致思路捋下?依然是.二分出每个奶酪的开始和结束时间,然后check下最大流的流量和$\sum p$的大小.做完了.$over$

然后详细考虑过程,发现难点就在构图了呗,就,怎么构图能满足题目给定的条件

先列出题目两个和普通网络流不同的点趴$QwQ$:

1)每个奶酪有特定的开始&结束时间

2)同一个时间段一个奶酪只能被一只老鼠吃

$umm$其实第一个条件还是相对来说比较好实现的了,就考虑把时间拆成若干个区间,每个奶酪只要指向特定的区间就好$QwQ$

但是考虑第二个条件要怎么解决?这个姿势点我记得叶佬在省选前港网络流的时候港过这个技巧,,,?就说差分之后再连边.仔细思考下发现差分之后再连边就怎么跑都只相当于是被一只老鼠吃了$QwQ$

然后注意下差分之后的老鼠点和$T$连边时候的流量嗷$QwQ$

最后总结下怎么建图$QwQ$?奶酪建一排点,老鼠和时间一块儿建一排点,连边还是挺简单的不说了$QwQ$

然后不知道为什么我$T$了6个点,,,但是我自己拍都跑得挺快的,,,要哭了$QAQ$

$upd:$

这题真的是玄学趴,,,?就,我把$double$改成$float$,想着应该会跑得快些?结果$T$了9个点????$nmdwsm$,,$QAQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define lf double
#define gc getchar()
#define t(i) edge[i].to
#define n(i) edge[i].nxt
#define w(i) edge[i].wei
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];~i;i=n(i)) const int N=+;
const lf eps=1e-,inf=1e7;
int S,T,ed_cnt=-,head[N],cur[N],dep[N],n,m,st_cnt,s[N];
lf l,r,sum,a[N],st[N];
struct ed{int to,nxt;lf wei;}edge[N<<];
struct node{int p,r;lf d;}nod[N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il bool cmp(ri x,ri y){return x>y;}
il int name(ri x,ri y){return n+(x-)*st_cnt+y;}
il void ad(ri x,ri y,lf z)
{edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],(lf)};head[x]=ed_cnt;}
il bool bfs()
{
queue<int>Q;Q.push(S);memset(dep,,sizeof(dep));dep[S]=;
while(!Q.empty())
{ri nw=Q.front();Q.pop();e(i,nw)if(w(i)-eps> && !dep[t(i)])dep[t(i)]=dep[nw]+,Q.push(t(i));}
return dep[T];
}
il lf dfs(ri nw,lf flow)
{
if(nw==T || !flow)return flow;lf ret=;
for(ri &i=cur[nw];~i;i=n(i))
if(w(i) && dep[t(i)]==dep[nw]+)
{lf tmp=dfs(t(i),min(flow,w(i)));ret+=tmp,w(i)-=tmp;w(i^)+=tmp,flow-=tmp;}
return ret;
}
il lf dinic(){lf ret=;while(bfs()){rp(i,S,T)cur[i]=head[i];while(lf d=dfs(S,inf))ret+=d;}return ret;}
il bool check(lf t)
{
memset(head,-,sizeof(head));ed_cnt=-,st_cnt=;memset(a,,sizeof(a));
rp(i,,n)nod[i].d+=t,st[++st_cnt]=nod[i].r,st[++st_cnt]=nod[i].d;
sort(st+,st++st_cnt);st_cnt=unique(st+,st+st_cnt+)-st-;
rp(i,,n)ad(T,i,nod[i].p);
rp(i,,m)
rp(j,,st_cnt)
{
rp(k,,n)if(nod[k].r<=st[j] && st[j+]<=nod[k].d)ad(k,name(i,j),(lf)s[i]*(st[j+]-st[j]));
ad(name(i,j),S,s[i]*i*(st[j+]-st[j]));
}
lf tmp=dinic();rp(i,,n)nod[i].d-=t;
return sum-tmp<eps;
} int main()
{
// freopen("2570.in","r",stdin);freopen("2570.out","w",stdout);
ri K=read();
while(K--)
{
ed_cnt=-;l=;sum=;n=read();m=read();S=;T=n*+m*;
rp(i,,n)nod[i]=(node){read(),read(),(lf)read()},sum+=nod[i].p;rp(i,,m)s[i]=read();ri tmp=s[];
sort(s+,s++m,cmp);s[m+]=;rp(i,,m)s[i]=s[i]-s[i+];
l=;r=sum/tmp;while(r-l>eps){lf mid=(l+r)/;if(check(mid))r=mid;else l=mid;}
// printf("%.6lf\n",r);
}
return ;
}

QAQQQQQQ

洛谷$P2570\ [ZJOI2010]$贪吃的老鼠 网络流+二分的更多相关文章

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

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

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

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

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

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

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

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

  5. P2570 [ZJOI2010]贪吃的老鼠

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

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

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

  7. 【BZOJ1458】【洛谷4311】士兵占领(网络流)

    [BZOJ1458][洛谷4311]士兵占领(网络流) 题面 BZOJ权限题,洛谷真好 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最 ...

  8. 洛谷$P3324\ [SDOI2015]$星际战争 网络流+二分

    正解:网络流+二分 解题报告: 传送门$QwQ$ 其实我第一反应是费用流来着,,,但是仔细想了下发现我不会实现各个武器之间独立同时?而且攻击是连续的答案可能是小数嘛$QwQ$. 所以显然不是递推就二分 ...

  9. POJ Secret Milking Machine 【网络流+二分】

    题意:各一个地图,两点之间有若干条路,要在节点1和节点n之间行走t次(就是问1到n的路径数至少为t,每一条路径不能有重复),问所有路径里面最长的部分(这个题目特别强调,不是路径长度和,是路径中相邻两点 ...

随机推荐

  1. header发送Cookie

    Cookie传达给客户端的原理 平时执行setcookie('key1', 'value1');这样的代码时,浏览器就会收到cookie并保存,但我们并不能从echo出去的内容中看到cookie内容 ...

  2. tp3 key json 分页

    //json 强制转换为array $arr[$key]['checkpro'] = json_decode($val['checkpro'],JSON_FORCE_ARRAY);    $arr[$ ...

  3. docker oracle install

    https://hub.docker.com/r/9fevrier/oracle-11g Informations Oracle directory : /opt/oracle Data direct ...

  4. pytorch源码解析:Python层 pytorchmodule源码

    尝试使用了pytorch,相比其他深度学习框架,pytorch显得简洁易懂.花时间读了部分源码,主要结合简单例子带着问题阅读,不涉及源码中C拓展库的实现. 一个简单例子 实现单层softmax二分类, ...

  5. hdu 4179 Difficult Routes (SP)

    Problem - 4179 坑了我一个晚上的SP题. 题意是,给出若干空间中的点,给出其中某些点之间是有直线线段路径相连的.要求求出一条从s开始到t结束的路径,它的难度是d.难度的计算是空间线段两点 ...

  6. Java 对象序列化机制详解

    对象序列化的目标:将对象保存到磁盘中,或允许在网络中直接传输对象. 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,通过网络将这种二进制流传 ...

  7. HTML--CSS样式表--基本概念(超链接的状态)

    样式表的基本概念 一.样式表的分类 1.内联样式表 和HTML联合显示,控制精确,但是可重用性差,冗余较多. 例:<p style="font-size:14px;"> ...

  8. Python--day40--datetime,socketserver,Threading模块分别是哪些模块的高层模块

  9. Codeforces Round #194 (Div.1 + Div. 2)

    A. Candy Bags 总糖果数\(\frac{n^2(n^2+1)}{2}\),所以每人的数量为\(\frac{n}{2}(n^2+1)\) \(n\)是偶数. B. Eight Point S ...

  10. Vue 中的过滤器的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...