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的更多相关文章

  1. 【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348

    目录 Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 MEA ...

  2. BZOJ5280: [Usaco2018 Open]Milking Order(二分+拓扑)

    5280: [Usaco2018 Open]Milking Order Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 123  Solved: 62[ ...

  3. [Usaco2018 Open]Milking Order

    Description Farmer John的N头奶牛(1≤N≤10^5),仍然编号为1-N,正好闲得发慌.因此,她们发展了一个与Farmer John每天早上为她们挤牛奶的时候的排队顺序相关的复杂 ...

  4. [BZOJ5280] [Usaco2018 Open]Milking Order

    Description Farmer John的N头奶牛(1≤N≤105),仍然编号为1…N,正好闲得发慌.因此,她们发展了一个与Farmer John每 天早上为她们挤牛奶的时候的排队顺序相关的复杂 ...

  5. 【杂题1】USACO 2018 Open Contest-练习

    https://www.xoj.red/contests/show/1231 下面会写一些题目的解析什么的,当然不会粘贴题目只是简单提一下 (部分题目简单的题目就不概括了) 其实难度应该前面比较低. ...

  6. codeforce ---A. Milking cows

    A. Milking cows time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  7. 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY

    正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade   随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...

  8. BZOJ 1391: [Ceoi2008]order [最小割]

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1509  Solved: 460[Submit][Statu ...

  9. Android中的Libraries以及Order and Export的使用。

    1Add JAR 从Eclipse的现有所有工程中,添加jar包到该工程下 2Add External JARs 从Eclipse外的其他的位置,添加jar包到该工程下 3Add Variable 增 ...

随机推荐

  1. SOA架构

    基于服务的SOA架构_后续篇   今天是元宵节,首先祝各位广大博友在接下来的光阴中技术更上一层,事事如意!(没能在元宵节发布,今天就补上吧) 昨天简单介绍了一下本人在近期开发过的一个电商购物平台的架构 ...

  2. 【C++】随机重命名MP3文件

    新置MP3一件,竟然没有随机播放的功能.坑啊!身为程序媛一枚,自己动手吧~ 获取当前路径: char buf[1000]; GetCurrentDirectory(1000,buf); string ...

  3. UVa 11400 - Lighting System Design(线性DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. 19、配置嵌入式servlet容器(下)

    使用外置的Servlet   嵌入式Servlet容器:应用打成可执行的j ar 优点:简单.便携: 缺点:默认不支持JSP.优化定制比较复杂         使用定制器[ServerProperti ...

  5. Redis配置文件(3)常见的配置修改

    常见的配置: redis.conf 配置项说明如下: 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程   daemonize no   2. 当Redis以 ...

  6. fastjson是什么东东?

    fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库.Fastjson ...

  7. mybatis查询缓存

    一级缓存针对每个sqlSession进行缓存,sqlSession销毁,一级缓存就不存在. ,使用Map存储了sql执行查询结果集(java对象) 二级缓存针对每个map的namespace进行缓存. ...

  8. 使用npm uninstall卸载express无效

    最近在看<node.js开发指南>学习node.js,因为书是2012年的书,对应的各种软件.包的版本就特别老,其中第五章用到express,书中版本用的是2.X版本,而我这边通过npm ...

  9. MFC中用户自定义类响应自定义消息

    这篇技术文章不是讨论经典的MFC中的消息工作机理的,讨论消息工作原理.方式和路径的文章在网上和书本中随处可见.网上众多的讨论都是关于如何响应并进行用户自定义消息映射的:网上还有一些文章介绍如何在自定义 ...

  10. Android 进价5_自定义广播 通过广播更新ListView的适配器 下载管理

    1.在处理下载管理时,服务在后台运行,下载完成后要更新listview列表的按钮,将“下载”改成“打开”这样一个功能. 在Activity里面写一个静态内部类,继承广播.其中属性text_button ...