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. OID OAM WLS等Oracle 中间件日志位置汇总

    WLS的log:/tip/IMP/bea/user_projects/domains/IDMDomain/servers/AdminServer/logsOID的log:/tip/IMP/bea/us ...

  2. Simotion 凸轮同步,偏移凸轮起点

    将同步对象的 SyncingMotion.camReferenceBySlaveModeRelative 修改为 POSITION_AT_START_OF_CAMMING myRetDINT := _ ...

  3. python实现读取类别频数数据画水平条形图

    1.数据分组-->频数分布表 环境配置: import pandas as pd import numpy as np import matplotlib.pyplot as plt 按照你设定 ...

  4. maven工程src/main/java目录无法创建问题

    在项目上右键选择properties,然后点击Javabuild path,在Librarys下,编辑JRE System Library,选择 workspace default jre 即可

  5. Yii 读写分离 分表分库

    本文转自  http://hudeyong926.iteye.com/blog/1299989 实现一主一从,一主多从,多主多从的读写分离 .支持DAO,AR,其中Query builder只完成部分 ...

  6. JavaScript小游戏--2048(PC端)

    1.初始化棋局 $(document).ready(function() { prepare_for_mobile(); //适配移动端 new_game(); }); 2.开始新游戏 functio ...

  7. master分支合并

    一.Sourcetree简单介绍 通过Git可以进行对项目的版本管理,但是如果直接使用Git的软件会比较麻烦,因为是通过一条一条命令进行操作的.  Sourcetree则可以与Git结合,提供图形界面 ...

  8. Redis(RedisTemplate)运算、算法(incr、decr、increment)

    RedisTemplate配置:https://www.cnblogs.com/weibanggang/p/10188682.html package com.wbg.springRedis.test ...

  9. HDU 1022 Train Problem I(栈的操作规则)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1022 Train Problem I Time Limit: 2000/1000 MS (Java/Ot ...

  10. OpenMax的接口与实现

    OpenMax IL层的接口定义由若干个头文件组成,这也是实现它需要实现的内容,它们的基本描述如下所示. OMX_Types.h:OpenMax Il的数据类型定义 OMX_Core.h:OpenMa ...