洛谷$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,每一条路径不能有重复),问所有路径里面最长的部分(这个题目特别强调,不是路径长度和,是路径中相邻两点 ...
随机推荐
- android service中stub作用是什么?
AIDL(android 接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互.如果你需要在一个进程中(例如:在一个Activit ...
- Vue电商后台管理系统项目第1天-基本环境搭建&登录功能
基本环境搭建完成 安装npm包:npm -S i vue vue-router axios element-ui 配置Eslint: 打开设置,搜索Eslint拓展,然后将下面代码覆盖进去即可 { , ...
- js中字符串拼接html
1.使用转义字符 ": " " "+userName+" " " 效果:"userName" 2. 单引号中拼 ...
- C# Find vs FirstOrDefault
本文告诉大家,在获得数组第一个元素时,使用哪个方法性能更高. 需要知道,两个方法都是 Linq 的方法,使用之前需要引用 Linq .对于 List 等都是继承可枚举Enumerable这时获取第一个 ...
- oracle函数 sys_guid()
[功能]生产32位的随机数,不过中间包括一些大写的英文字母. [返回]长度为32位的字符串,包括0-9和大写A-F [示例] select sys_guid() from dual
- Libev源码分析02:Libev中的IO监视器
一:代码流程 在Libev中,启动一个IO监视器,等待该监视器上的事件触发,然后调用该监视器的回调函数.整个的流程是这样的: 首先调用ev_default_loop初始化struct ev_loop ...
- selenium webdriver学习(九)------------如何操作cookies(转)
selenium webdriver学习(九)------------如何操作cookies 博客分类: Selenium-webdriver Web 测试中我们经常会接触到Cookies,一个C ...
- oracle 识别’低效执行’的SQL语句
用下列SQL工具找出低效SQL: SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_ ...
- POJ 2752 Seek the Name, Seek the Fame next数组理解加深
题意:给你一个字符串,寻找前缀和后缀相同的子串(包括原串). 从小到大排列输出其子串的长度 思路:KMP next 数组应用. 其实就是一个数学推导过程. 首先由next数组 可知s(ab) = s ...
- 条件随机场(CRF) - 3 - 概率计算问题
声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了 ...