Milking Order
Milking Order
题意:给出m个描述状态,其中包含若干个边的关系,问最多能取x (x<=m)个状态,使得形成的图没有环。就是说取x个状态,用状态中的关系建边,其中不能有环。
题解:最大化x?和二分答案有点关系。所以首先要二分x,判断是否有环。这个可以用拓扑或者tarjan。我用的是拓扑,判环的依据是队尾t是否等于n,如果不等于n,则一定有环。(只有入度等于1才进队)于是操作就有点复杂了,(我会在程序里标记)。最后因为要字典序最小,要用堆来输出答案。
var
q,head,next,rd,a,b,id,ans,f:array[..]of longint;
e,i,j,mid,x,y,z,l,r,t,len,n,k,tot,m:longint;
procedure add(x,y:longint);
begin
inc(e);next[e]:=head[x];head[x]:=e; a[e]:=y;id[e]:=i;
end;
function check(mid:longint):boolean; var i,h,tail:longint;
begin
fillchar(rd,sizeof(rd),);
fillchar(q,sizeof(q),);
tail:=; t:=;
for i:= to e do
begin
if id[i]<=mid then
begin
inc(rd[a[i]]);
end;
end; for i:= to n do
if rd[i]= then
begin
inc(t);
inc(tail);
q[tail]:=i;
end;
if tail= then exit(false);
h:=;
while h<tail do
begin
inc(h);
i:=head[q[h]];
while (id[i]>mid)and(i>) do begin i:=next[i]; end;// 判断边是否超过mid while (i>) do
begin
dec(rd[a[i]]);
if rd[a[i]]= then
begin
inc(t);inc(tail);q[tail]:=a[i];
// if mid = then writeln(tail);
end;
i:=next[i];
while (i>)and(id[i]>mid) do i:=next[i]; //同样判断
end;
end; if t=n then exit(true) else exit(false);
end;
procedure make(x:longint);
var now,father,t:longint;
begin
inc(len);
f[len]:=x;
now:=len;
while (now>)and(f[now>>]>f[now]) do
begin
father:=now>>;
t:=f[father];
f[father]:=f[now];
f[now]:=t;
now:=father;
end;
end; function detele:longint;
var fa,son,t:longint;
ss:boolean;
begin
k:=f[];
f[]:=f[len];
dec(len);
fa:=;ss:=false;
while ((fa*<=len)or(fa*+<=len))and(not ss) do
begin
if (fa*+>len) or(f[fa*]<f[fa*+]) then
son:=fa* else son:=fa*+;
if f[fa]>f[son] then
begin
t:=f[fa];
f[fa]:=f[son];
f[son]:=t;
fa:=son;
end
else break;
end;
end; begin
readln(n,m);
for i:= to m do
begin
read(x);
for j:= to x do
begin
read(y);
if j> then begin add(z,y); end;
z:=y;
end;
end;
l:=;r:=m;
while l<=r do//二分答案模板(
begin
mid:=(l+r) div ;
//writeln(l,' ',r);
if check(mid) then l:=mid+ else r:=mid-; end;
l:=l-;//直到这里) fillchar(rd,sizeof(rd),);
for i:= to e do
begin
if id[i]<=l then
begin
inc(rd[a[i]]);
end;
end;
for i:= to n do
begin
if rd[i]= then make(i);//堆操作
end;
tot:=;
while tot<n do
begin
inc(tot);
detele;
write(k,' ');//堆操作
i:=head[k];
while (id[i]>l)and(i>) do i:=next[i];//判断是否大于二分答案的最终答案 while i> do
begin
dec(rd[a[i]]);
if rd[a[i]]= then make(a[i]);
i:=next[i];
while (i>)and(id[i]>mid) do i:=next[i];//也需要判断
end;
end;
end.
Milking Order的更多相关文章
- 【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348
目录 Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 MEA ...
- BZOJ5280: [Usaco2018 Open]Milking Order(二分+拓扑)
5280: [Usaco2018 Open]Milking Order Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 123 Solved: 62[ ...
- [Usaco2018 Open]Milking Order
Description Farmer John的N头奶牛(1≤N≤10^5),仍然编号为1-N,正好闲得发慌.因此,她们发展了一个与Farmer John每天早上为她们挤牛奶的时候的排队顺序相关的复杂 ...
- [BZOJ5280] [Usaco2018 Open]Milking Order
Description Farmer John的N头奶牛(1≤N≤105),仍然编号为1…N,正好闲得发慌.因此,她们发展了一个与Farmer John每 天早上为她们挤牛奶的时候的排队顺序相关的复杂 ...
- 【杂题1】USACO 2018 Open Contest-练习
https://www.xoj.red/contests/show/1231 下面会写一些题目的解析什么的,当然不会粘贴题目只是简单提一下 (部分题目简单的题目就不概括了) 其实难度应该前面比较低. ...
- codeforce ---A. Milking cows
A. Milking cows time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY
正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade 随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...
- BZOJ 1391: [Ceoi2008]order [最小割]
1391: [Ceoi2008]order Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1509 Solved: 460[Submit][Statu ...
- Android中的Libraries以及Order and Export的使用。
1Add JAR 从Eclipse的现有所有工程中,添加jar包到该工程下 2Add External JARs 从Eclipse外的其他的位置,添加jar包到该工程下 3Add Variable 增 ...
随机推荐
- Master的注册机制和状态改变管理解密
本课主题 Master 接收 Worker, Driver, Application 注册 Master 处理 Driver 狀态变换 Master 处理 Executor 狀态变换 Master 接 ...
- C++使用BOOST操作文件、目录
开始使用 在BOOST库出现之前,C++对于文件和目录的操作,大都借助于UNIX提供的底层文件和目录接口,从使用角度来看,这些底层的操作不够友好.BOOST中filesystem库是一种可移植的文件系 ...
- zt C++标准库set类型
C++标准库set类型 分类: C++编程语言 2012-11-06 10:53 909人阅读 评论(0) 收藏 举报 目录(?)[-] 在set中添加元素 从set中获取元素 set容器只是单纯的键 ...
- 如何将程序添加到Windows桌面右键菜单
在Windows桌面上右键单击鼠标时,将显示默认菜单.如果您想要将其它程序添加到Windows桌面右键菜单中,则可以按照以下步骤执行: 运行WinUtilities上下文菜单管理器 点击添加 选择菜单 ...
- [原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构
在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构: (1) AVFormatContext AVFormatContext是一个贯穿始终的数据结构,很多函 ...
- commons.pool2 对象池的使用
commons.pool2 对象池的使用 ? 1 2 3 4 5 <dependency> <groupId>org.apache.commons</groupI ...
- hdu1579 Function Run Fun(深搜+记忆化)
版权声明:本文为博主原创文章.未经博主同意不得转载.vasttian https://blog.csdn.net/u012860063/article/details/37076755 转载请注明出处 ...
- ZooKeeper介绍与环境搭建
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- 优秀的WEB前端开发框架:Bootstrap!
其实早就对Bootstrap有所耳闻,大概了解这哥们是做WEB前端的 但直到昨天以前,还没有对他产生任何深入了解的兴趣 冷落他的主要原因还是觉得会束缚手脚,毕竟自己多年来在WEB前端的积累一直没有停滞 ...
- PHP------面向对象的特性
面向对象的特性 一.面向对象有三大特性: 封装.继承.多态.(非常重要,第一要记住!!!!!!!!!!) 二.封装 封装就是用来做类的,把一个类封装起来.做类不能随便的做.我们做类不能随便去写一个类, ...