BZOJ.2034.[2009国家集训队]最大收益(二分图匹配 贪心)
题目链接
双倍经验:BZOJ.4276.[ONTAK2015]Bajtman i Okrągły Robin(然而是个权限题。区间略有不同)
\(Description\)
有\(n\)个任务,完成一个任务需要\(1\)时刻,并会获得\(v_i\)的收益(只获得一次)。
每一时刻只能做一个任务,且每个任务只能在\([l_i,r_i]\)的时刻内做。求最大收益。
\(n\leq5000,l_i,r_i\leq10^8\)。
\(Solution\)
我为啥看不懂堆的\(O(n^2\log n)\)做法啊。。
(官方题解:https://wenku.baidu.com/view/c64d851ba8114431b90dd846.html)
首先可以跑费用流。因为要对区间连边所以要线段树优化。复杂度还是有点高,可以卡过BZOJ4276(BZOJ2034就算了 区间范围1e8)。
假设同一时刻有多个任务要完成时,会有冲突,我们自然是选价值最高的。
我们按收益从大到小排序,如果收益大的能选,那么一定先选(这只可能导导致同在这个时刻的任务不能选,但反正只能选一个,显然选最大的优)。
那现在的问题是,如何在必选某些任务的情况下,判断当前能不能选。
可以每次跑匈牙利判断一下,不过是\(n^3\),但是好像能过smg?
我们将任务区间按左端点排序,要选的任务应该尽量往前排,给后面腾时间。如果当前任务因为时间晚不能做,就尝试把前面的任务往后挤。
具体实现:对当前任务i枚举它区间的时刻,如果当前时刻没有任务就安排给它;
否则设当前时刻的任务为x,若r[x]>r[i],尝试将x往后挤,最后如果能把x匹配到另一个位置就成功匹配,否则i就不可能匹配了;
如果r[x]<=r[i],尝试把i往下一个时刻放。
时刻肯定不能直接枚举。我们发现有用的时刻最多只有\(n\)个。即每个位置的下一个可匹配的位置。
所以对区间离散化一下就行了。
贪心算法正确性的一个解释
考虑匈牙利算法,从大到小一个一个匹配,一个点一旦在匹配中,那么一直在匹配里面。
复杂度\(O(n^2)\)。
有个小优化是,上面说的x如果在之前被判为不可行,后面就没必要继续DFS它了。
//1400kb 460ms
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=5005;
int ref[N],lk[N],tag[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Node
{
int l,r,v;
bool operator <(const Node &x)const{
return v>x.v;
}
}A[N];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int Lower(int x,int r)
{
int l=1,mid;
while(l<r)
if(ref[mid=l+r>>1]<x) l=mid+1;
else r=mid;
return l;
}
inline int Upper(int x,int r)
{
int l=1,mid;
while(l<r)
if(ref[mid=l+r>>1]<=x) l=mid+1;
else r=mid;
return l;
}
bool DFS(int x,int l,int r)
{
if(l>r) return 0;
int p=lk[l];
if(!p) return lk[l]=x,1;
if(A[p].r>A[x].r)
if(!tag[p]&&DFS(p,l+1,A[p].r)) return lk[l]=x,1;
else return tag[p]=1,0;
return DFS(x,l+1,r);
}
int main()
{
int n=read();
for(int i=1; i<=n; ++i) A[i]=(Node){ref[i]=read(),read(),read()};
std::sort(ref+1,ref+1+n); ref[n+1]=1e9;
for(int i=2; i<=n; ++i) ref[i]=std::max(ref[i-1]+1,ref[i]);
for(int i=1; i<=n; ++i) A[i].l=Lower(A[i].l,n), A[i].r=Upper(A[i].r,n+1)-1;
std::sort(A+1,A+1+n); long long ans=0;
for(int i=1; i<=n; ++i)
if(DFS(i,A[i].l,A[i].r)) ans+=A[i].v;
printf("%lld\n",ans);
return 0;
}
BZOJ.2034.[2009国家集训队]最大收益(二分图匹配 贪心)的更多相关文章
- BZOJ 2034: [2009国家集训队]最大收益 [贪心优化 Hungary]
2034: [2009国家集训队]最大收益 题意:\(n \le 5000\)个区间\(l,r\le 10^8\),每个区间可以选一个点得到val[i]的价值,每个点最多选1次,求最大价值 线段树优化 ...
- 【BZOJ2034】[2009国家集训队]最大收益 贪心优化最优匹配
[BZOJ2034][2009国家集训队]最大收益 Description 给出N件单位时间任务,对于第i件任务,如果要完成该任务,需要占用[Si, Ti]间的某个时刻,且完成后会有Vi的收益.求最大 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子
二次联通门 : BZOJ 2038: [2009国家集训队]小Z的袜子 /* BZOJ 2038: [2009国家集训队]小Z的袜子 莫队经典题 但是我并不认为此题适合入门.. Answer = ∑ ...
- BZOJ 2039: [2009国家集训队]employ人员雇佣
2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1369 Solved: 667[Submit ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7676 Solved: 3509[Subm ...
- BZOJ 2038 [2009国家集训队]小Z的袜子 莫队
2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...
- Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 5763 Solved: 2660[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )
莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...
随机推荐
- eMMC基础技术8:操作模式1-boot mode
1.前言 eMMC总线操作包含: boot mode device identification mode interrupt mode data transfer mode 本文主要描述boot m ...
- Java SSH远程执行Shell命令、shell脚本实现(Ganymed SSH)
jar包下载地址: http://www.ganymed.ethz.ch/ssh2/ 此源码的好处就是没有依赖很多其他的包,拷贝过来干干净净.具体代码实现可以看下文,或参考官方文档,在下载的压缩包里g ...
- sqlyog通过跳板机ssh连接mysql数据库
方法一: 方法二: 在跳板机上启动sh脚本做ssh端口转发,客户端配置连接 10.0.0.1的8306端口即可 jdbc:mysql://10.0.0.1:8306/testdb?useUnicode ...
- 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...
- ipython+notebook使用教程(转载)
ipython是python交互环境的增强版 IPython notebook目前已经成为用Python做教学.计算.科研的一个重要工具.IPython Notebook使用浏览器作为界面,向后台的I ...
- MySQL----数据库操作2
数据库高级操作: SHOW DATABASES; 显示数据库 CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci CR ...
- hdu2838树状数组解逆序
离散化和排序后的序号问题搞得我实在是头痛 不过树状数组解逆序和偏序一类问题真的好用 更新:hdu的数据弱的真实,我交上去错的代价也对了.. 下面的代码是错的 /* 每个点的贡献度=权值*在这个点之前的 ...
- graphql详解
随着系统业务量的增大不同的应用和系统共同使用着许多的服务api,而随着业务的变化和发展,不同的应用对相同资源的不同使用方法最终会导致需要维护的服务api数量呈现爆炸式的增长,比如我试着跑了下我们自己业 ...
- 线上Slave报1062的案例
最近经常线上的Slave老报1062的错误,蛋碎一地,幸好Slave暂时没有用到业务上,也就是说没有做读写分离,所以Slave有问题,影响也不大,但每隔一阵子就报1062主键冲突的错误,让我好纠结,如 ...
- python 全栈开发,Day32(知识回顾,网络编程基础)
一.知识回顾 正则模块 正则表达式 元字符 : . 匹配除了回车以外的所有字符 \w 数字字母下划线 \d 数字 \n \s \t 回车 空格 和 tab ^ 必须出现在一个正则表达式的最开始,匹配开 ...