洛谷$P2570\ [ZJOI2010]$贪吃的老鼠 网络流+二分
正解:网络流+二分
解题报告:
和上一题有点儿像,,,?$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]$贪吃的老鼠 网络流+二分的更多相关文章
- luogu P2570 [ZJOI2010]贪吃的老鼠【二分+最大流】
首先考虑只满足第一个条件,二分答案,把过期时间加上mid之后的2n个时间离散,老鼠拆成每个时间的,第i个时间第j个老鼠为id[i][j],连接(s,i,p[i]),对于离散后时间(g[j-1]~g[j ...
- Luogu P2570 [ZJOI2010]贪吃的老鼠
Luogu P2570 [ZJOI2010]贪吃的老鼠 题目描述 奶酪店里最近出现了\(m\)只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产\(n\)块奶酪,其中第\(i\)块的 ...
- Luogu2570 [ZJOI2010]贪吃的老鼠 ---- 网络流
Luogu2570 [ZJOI2010]贪吃的老鼠 题面描述 https://www.luogu.org/problemnew/show/P2570 然后题意大概就是m只老鼠,然后吃n个奶酪,已知 ...
- [ZJOI2010]贪吃的老鼠 网络流
---题面--- 题解: 这是一道强题emmmm,做法非常巧妙,,,我也是看了好久大佬题解才看明白一点 首先考虑没有限制的情况,即n个老鼠可以在同一时刻吃同一块奶酪 对各个时间段拆点,连奶酪 ---& ...
- P2570 [ZJOI2010]贪吃的老鼠
传送门 →_→唯一一篇能看得懂的题解---->这里 很容易想到二分+网络流,然而并没有什么卵用--出题人的思路太神了-- 首先考虑如果一块奶酪在同一时间可以被多只老鼠吃的话,该如何建图.首先不难 ...
- [ZJOI2010]贪吃的老鼠(网络流+建图)
题目描述 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块奶酪,其中第i块的大小为pi,会在第ri秒被生产出来,并且必须在第di秒之前将它吃掉.第j只老鼠吃 ...
- 【BZOJ1458】【洛谷4311】士兵占领(网络流)
[BZOJ1458][洛谷4311]士兵占领(网络流) 题面 BZOJ权限题,洛谷真好 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最 ...
- 洛谷$P3324\ [SDOI2015]$星际战争 网络流+二分
正解:网络流+二分 解题报告: 传送门$QwQ$ 其实我第一反应是费用流来着,,,但是仔细想了下发现我不会实现各个武器之间独立同时?而且攻击是连续的答案可能是小数嘛$QwQ$. 所以显然不是递推就二分 ...
- POJ Secret Milking Machine 【网络流+二分】
题意:各一个地图,两点之间有若干条路,要在节点1和节点n之间行走t次(就是问1到n的路径数至少为t,每一条路径不能有重复),问所有路径里面最长的部分(这个题目特别强调,不是路径长度和,是路径中相邻两点 ...
随机推荐
- Helm V3 新版本发布
Helm v3.0.0 Alpha 1 is coming! Helm 作为 Kubernetes 体系的包管理工具,已经逐渐成为了事实上的应用分发标准.根据 2018 年 CNCF 的一项云原生用户 ...
- js获取dom节点
var s= document.getElementById("test");del_ff(s); //清理空格var chils= s.childNodes; //得到s的全部子 ...
- Java Annotation详解(一): 理解和使用Annotation
JDK1.5之后,引入了元数据的概念,也就是Annotation(注释),其实它是代码里的特殊标记,这些标记可以再编译.类加载.运行时被读取,并执行相应的处理. 元数据的作用: 如果要对于元数据的作用 ...
- H3C 帧中继显示与调试
- spring boot + thymeleaf 乱码问题
spring boot + thymeleaf 乱码问题 hellotrms 发布于 2017/01/17 15:27 阅读 1K+ 收藏 0 答案 1 开发四年只会写业务代码,分布式高并发都不会还做 ...
- Django入门6--Django超链接
- 关于Android studio Haxm加速器安装
首先,在SDK manager中要安装如下选项 安装后,在启动虚拟机时如果提示你没有Install Haxm,在目录sdk\extras\intel\Hardware_Accelerated_Exec ...
- 2019-6-5-WPF-使用封装的-SharpDx-控件
title author date CreateTime categories WPF 使用封装的 SharpDx 控件 lindexi 2019-6-5 9:4:36 +0800 2018-4-24 ...
- 2019-4-29-C#-从-short-转-byte-方法
title author date CreateTime categories C# 从 short 转 byte 方法 lindexi 2019-4-29 12:8:39 +0800 2019-01 ...
- Fetch 记录
encodeURI()不会对本身属于URI的特殊字符进行编码,例如冒号.正斜杠.问号和井字号:而encodeURIComponent()则会对它发现的任何非标准字符进行编码. Fetch 请求body ...