博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-3729 I'm Telling the Truth
阅读量:4935 次
发布时间:2019-06-11

本文共 1118 字,大约阅读时间需要 3 分钟。

一个点集是学生,一个点集是排名。然后通过学生的排名范围连线,求此二分图的最大匹配。

本题还要求是最大字典序输出,那么由贪心可得,你让标号从大到小找增广边就行了。

#include 
#include
#include
#include
#include
#include
#include
#define rep(i, l, r) for(int i=l; i<=r; i++)#define down(i, l, r) for(int i=l; i>=r; i--)#define N 69#define M 100009using namespace std;int read(){ int x=0, f=1; char ch=getchar(); while (ch<'0' || ch>'9') { if (ch=='-') f=-1; ch=getchar(); } while (ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f;}int n, l[N], r[N], k[M], b[M], ans, ansk[N], s;bool Find(int x){ rep(i, l[x], r[x]) if (b[i]!=s) { b[i]=s; if (!k[i] || Find(k[i])) { k[i]=x; return true; } } return false;}int main(){ int t=read(); while (t--) { n=read(); rep(i, 1, n) l[i]=read(), r[i]=read(); rep(i, 1, M-1) k[i]=b[i]=0; rep(i, 1, n) ansk[i]=0; ans=0; down(i, n, 1) if (Find(s=i)) ans++, ansk[i]=1; printf("%d\n", ans); rep(i, 1, n) if (ansk[i]) { if (--ans) printf("%d ", i); else printf("%d\n", i); } } return 0;}

  

转载于:https://www.cnblogs.com/NanoApe/p/4345570.html

你可能感兴趣的文章
Table Basics [转载]
查看>>
Logback 学习笔记
查看>>
并查集
查看>>
11、组件注册-使用FactoryBean注册组件
查看>>
nyoj_95_众数问题_map练习
查看>>
uchome 是如何将数据插入数据库的
查看>>
For循环
查看>>
020-安装centos6.5后的生命历程
查看>>
面试介绍项目经验(转)
查看>>
创建并设置ASP.NET的会话状态服务器(SQL State Server)
查看>>
<metro>Google的验证
查看>>
SQL中NUMERIC和DECIMAL的区别
查看>>
安卓课程设计:微课表
查看>>
Oracle 表的分组操作
查看>>
在OS X上的Intllij Idea中配置GlassFish
查看>>
用查表法快速转换yv12到RGB【转】
查看>>
使用公钥登录SSL
查看>>
实验四 shell 编程(2)
查看>>
hdu 1290_献给杭电五十周年校庆的礼物
查看>>
Nginx 入门
查看>>