题目链接

双倍经验: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国家集训队]最大收益(二分图匹配 贪心)的更多相关文章

  1. BZOJ 2034: [2009国家集训队]最大收益 [贪心优化 Hungary]

    2034: [2009国家集训队]最大收益 题意:\(n \le 5000\)个区间\(l,r\le 10^8\),每个区间可以选一个点得到val[i]的价值,每个点最多选1次,求最大价值 线段树优化 ...

  2. 【BZOJ2034】[2009国家集训队]最大收益 贪心优化最优匹配

    [BZOJ2034][2009国家集训队]最大收益 Description 给出N件单位时间任务,对于第i件任务,如果要完成该任务,需要占用[Si, Ti]间的某个时刻,且完成后会有Vi的收益.求最大 ...

  3. BZOJ 2038: [2009国家集训队]小Z的袜子

    二次联通门 : BZOJ 2038: [2009国家集训队]小Z的袜子 /* BZOJ 2038: [2009国家集训队]小Z的袜子 莫队经典题 但是我并不认为此题适合入门.. Answer = ∑ ...

  4. BZOJ 2039: [2009国家集训队]employ人员雇佣

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1369  Solved: 667[Submit ...

  5. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  6. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...

  7. BZOJ 2038 [2009国家集训队]小Z的袜子 莫队

    2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...

  8. Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 5763  Solved: 2660[Subm ...

  9. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )

    莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...

随机推荐

  1. SpringMVC使用Redis作为缓存提供者

    (1)pom添加依赖项 <dependency> <groupId>org.springframework.data</groupId> <artifactI ...

  2. linux 高级字符设备驱动 ioctl操作介绍 例程分析实现【转】

    转自:http://my.oschina.net/u/274829/blog/285014 1,ioctl介绍 ioctl控制设备读写数据以及关闭等. 用户空间函数原型:int ioctl(int f ...

  3. C# 关于用7zip压缩文件提示win32exception 系统找不到文件解决方案(win7 x64)

    网上已经很多这方面的资料了,我就简单的说下好了 为了方便以后的查看 --------------------- 1.需要下载7zSharp:http://7zsharp.codeplex.com/re ...

  4. 【实践】Yalmip使用Knitro的一些总结

    Yalmip使用Knitro的一些总结 1.软件 Knitro 11.0.1 Win64(包含安装包和确定机器ID的软件):链接:https://pan.baidu.com/s/14IfxlAdo3m ...

  5. Ex 6_1 和最大的相连子序列..._第五次作业

    设数值列表a0,a1 . . . an存放在数组arr[0. . .n]中. sum[0],sum[1],sum[2] . . . .sum[n]为以该下标为终点元素的连续子序列的和的最大值,则sum ...

  6. PYTHON-基本数据类型-元祖类型,字典类型,集合类型-练习

    # 1 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],# 将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中## 即: ...

  7. OneNET麒麟座应用开发之十:空气质量数据监测站项目总结

    大气质量数据监测站用于测试空气质量监测及数据采集,实现野外或者室内空气质量的检测. 1.项目概述 本项目是一个定制项目,要求采集大气的压力.温度.湿度.PM25.位置等数据并上传到指定的后台服务器.但 ...

  8. GuzzleHttp 请求设置超时时间

    之前调用一个三方的 WEB API,大量的请求超时,导致 PHP 进程被占用完.整个网站一直报 504. 其中一个优化措施就是对三方 API 调用设置超时时间. use GuzzleHttp\Clie ...

  9. (四)CXF处理JavaBean以及复合类型

    前面讲的是处理简单类型,今天这里来讲下CXF处理JavaBean以及复合类型,比如集合: 这里实例是客户端传一个JavaBean,服务器端返回集合类型: 在原来的项目实例基础上,我们先创建一个实体类U ...

  10. 《剑指offer》-二叉搜索树与双向链表

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目的描述不是很习惯.题目的意思是把二叉树从左到右遍历,相当于双向链表的遍历. 其实 ...