洛谷$P2570\ [ZJOI2010]$贪吃的老鼠 网络流+二分
正解:网络流+二分
解题报告:
传送门$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=200000+10;
const lf eps=1e-5,inf=1e7;
int S,T,ed_cnt=-1,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<<2];
struct node{int p,r;lf d;}nod[N];il int read()
{rc ch=gc;ri x=0;rb y=1;while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;if(ch=='-')ch=gc,y=0;while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),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-1)*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)0};head[x]=ed_cnt;}
il bool bfs()
{queue<int>Q;Q.push(S);memset(dep,0,sizeof(dep));dep[S]=1;while(!Q.empty()){ri nw=Q.front();Q.pop();e(i,nw)if(w(i)-eps>0 && !dep[t(i)])dep[t(i)]=dep[nw]+1,Q.push(t(i));}return dep[T];
}
il lf dfs(ri nw,lf flow)
{if(nw==T || !flow)return flow;lf ret=0;for(ri &i=cur[nw];~i;i=n(i))if(w(i) && dep[t(i)]==dep[nw]+1){lf tmp=dfs(t(i),min(flow,w(i)));ret+=tmp,w(i)-=tmp;w(i^1)+=tmp,flow-=tmp;}return ret;
}
il lf dinic(){lf ret=0;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,-1,sizeof(head));ed_cnt=-1,st_cnt=0;memset(a,0,sizeof(a));rp(i,1,n)nod[i].d+=t,st[++st_cnt]=nod[i].r,st[++st_cnt]=nod[i].d;sort(st+1,st+1+st_cnt);st_cnt=unique(st+1,st+st_cnt+1)-st-2;rp(i,1,n)ad(T,i,nod[i].p);rp(i,1,m)rp(j,1,st_cnt){rp(k,1,n)if(nod[k].r<=st[j] && st[j+1]<=nod[k].d)ad(k,name(i,j),(lf)s[i]*(st[j+1]-st[j]));ad(name(i,j),S,s[i]*i*(st[j+1]-st[j]));}lf tmp=dinic();rp(i,1,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=-1;l=0;sum=0;n=read();m=read();S=0;T=n*10+m*10;rp(i,1,n)nod[i]=(node){read(),read(),(lf)read()},sum+=nod[i].p;rp(i,1,m)s[i]=read();ri tmp=s[1];sort(s+1,s+1+m,cmp);s[m+1]=0;rp(i,1,m)s[i]=s[i]-s[i+1];l=0;r=sum/tmp;while(r-l>eps){lf mid=(l+r)/2;if(check(mid))r=mid;else l=mid;}
// printf("%.6lf\n",r);}return 0;
}
QAQQQQQQ
洛谷$P2570\ [ZJOI2010]$贪吃的老鼠 网络流+二分相关推荐
- 洛谷 P2570 [ZJOI2010]贪吃的老鼠
洛谷 P2570 [ZJOI2010]贪吃的老鼠 题目 题目描述 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块奶酪,其中第i块的大小为pi,会在第ri秒 ...
- Luogu P2570 [ZJOI2010]贪吃的老鼠
Luogu P2570 [ZJOI2010]贪吃的老鼠 题目描述 奶酪店里最近出现了\(m\)只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产\(n\)块奶酪,其中第\(i\)块的 ...
- [ZJOI2010] 贪吃的老鼠(二分+差分+神仙建图网络流)
problem luogu-P2570 solution 卧槽网络流尼玛神题 首先这个最小延长时间 TTT ,套路地考虑二分,将问题转化为判定性问题. 其次 n,mn,mn,m 和奶酪存在时间 [l, ...
- P2570 [ZJOI2010]贪吃的老鼠
传送门 →_→唯一一篇能看得懂的题解---->这里 很容易想到二分+网络流,然而并没有什么卵用--出题人的思路太神了-- 首先考虑如果一块奶酪在同一时间可以被多只老鼠吃的话,该如何建图.首先不难 ...
- [ZJOI2010]贪吃的老鼠
P2570 [ZJOI2010]贪吃的老鼠 在Ta的博客查看 显然二分,最大流判定 要满足两个条件: (1) 在任一时刻,一只老鼠最多可以吃一块奶酪: (2) 在任一时刻,一块奶酪最多被一只老鼠吃. ...
- 【网络流】LGP2570 [ZJOI2010]贪吃的老鼠
[题目] 原题地址 原题说的很清楚了,在这里也贴出来吧. 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块奶酪,其中第i块的大小为pi,会在第ri秒被生产出 ...
- 【c++算法刷题笔记】——洛谷2
1. 洛谷练习--P1579 哥德巴赫猜想(升级版) 题目描述: 现在请你编一个程序验证哥德巴赫猜想. 先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数. 输入格式: 仅有一行,包含一 ...
- 【c++算法刷题笔记】——洛谷1
2020/2/14-2/16 1. 循环提取一个数的每一位数字 while (d > 0) //d=0跳出循环 {x=d%10; //x每次为d的个位数 d = d / 10; //相当于d每次 ...
- 闲来无事刷水题、简单博弈论专题、sg函数、洛谷
记 今天闲来无事,不想刷codeforces了,到洛谷提高组训练营找几道水题刷着玩玩(虽然自己早已过了打OI的年纪)- 简单博弈论专题 P1199 三国游戏 这么考虑,由于电脑总是不能让我搭配出当前能 ...
最新文章
- one-hot encoding不是万能的,这些分类变量编码方法你值得拥有
- linux查询关键词上下行_Linux:从文件中搜索关键字并显示行数(cat,grep函数)
- core文件与gdb调试
- 为什么要拆分warning_repaired表?
- 『算法设计_伪代码』快速排序
- 开源框架 Apache Struts 2漏洞的 PoC 已公开
- C++ 临时变量的常量性
- com.android.pngp.tln,Android资源之图像资源(图像级别资源)
- C语言:输入一个华氏温度f,计算并输出对应的摄氏温度。计算摄氏温度的公式为:c=5/9*(f-32),输出取两位小数。
- 七日掌握设计配色基础pdf_零基础到底该如何学习室内设计!怎么才能掌握核心知识!...
- zip与rar的区别
- 解决谷歌浏览器翻译不能用问题
- oracle导出导入同义词,oracle同义词语句备份
- 实现景区门票计费系统(Java抽象类练习含GUI窗体组件)
- 获取电信光猫TEWA-600超级管理密码,修改电信光猫为桥接模式
- Echarts柱状图柱子点击事件
- 曾经连过的WiFi密码查询
- R语言(ggplot2)画KEGG信号通路气泡图
- 音频处理库—librosa的安装与使用
- Google Glass——个人移动设备的技术革新
热门文章
- CentOS6修改开机启动菜单背景图片
- vm 安装 ox 10.13
- 用matlab画三相桥式,matlab三相桥式电路仿真.doc
- Batch File Rename Utility(文件批量改名软件) 1.1.4231
- “RESOURCE MONITOR“CPU占用特别高
- C连载23-输入输出中星号的用法
- 东芝光耦TLP521-1智能型双电源开关控制器设计的实现
- 电影网上购票系统设计与实现(论文+系统)_kaic
- 2020年了,OCM认证,还有含金量么?
- 淮北打造智慧城管新模式