4276: [ONTAK2015]Bajtman i Okrągły Robin
4276: [ONTAK2015]Bajtman i Okrągły Robin
Time Limit: 40 Sec Memory Limit: 256 MB
Submit: 345 Solved: 186
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 4 40
2 4 10
2 3 30
1 3 20
Sample Output
HINT
Source
民间解法:
//(贪心)按权值排序匈牙利
/**************************************************************
Problem: 4276
User: gryz2016
Language: C++
Result: Accepted
Time:16732 ms
Memory:948 kb
****************************************************************/
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int N=;
struct node{int a,b,w;}f[N];
int n,ans,person,match[N],times[N];
inline bool cmp(const node &a,const node &b){
return a.w>b.w;
}
bool hunguary(int x){
times[x]=person;
for(int i=f[x].a;i<=f[x].b;i++){
if(!match[i]||(times[match[i]]!=person&&hunguary(match[i]))){
match[i]=x;
return ;
}
}
return ;
}
int main(){
n=read();
for(int i=;i<=n;i++) f[i].a=read(),f[i].b=read()-,f[i].w=read();
sort(f+,f+n+,cmp);
for(int i=;i<=n;i++){
person++;
if(hunguary(i)) ans+=f[i].w;
}
printf("%d",ans);
return ;
}
官方解法:
费用流作法是最暴力最显然的吧。。
一眼建图题,跑最大费用流,所以裸的是水不过去的。。
朴素建图:用xi表示每个强盗,用yi表示区间[i,i+1]。
(S,xi,1,ci)
(xi,yi(ai<=yi<bi),1,0)
(yi,T,1,0)
然后这样是过不了的。
我们发现每次连边都是左边一个点对应右边一段连续的区间,所以可以用线段树来优化。
在原来的基础上,我们不再从xi向每个对应的yi连边,而用线段树中的点来表示区间[ai,bi),然后连边。
对于线段树中的点,由父亲向儿子连容量为inf,费用为0的边。
由叶子节点向汇点T连容量为1,费用为0的边。
然后跑费用流。(引自ws_fqk)
/**************************************************************
Problem: 4276
User: gryz2016
Language: C++
Result: Accepted
Time:31629 ms
Memory:5736 kb
****************************************************************/
#include<cstdio>
#include<iostream>
#define lc k<<1
#define rc k<<1|1
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int N=;
const int M=2e5+;
const int inf=~0u>>;
struct node{int v,cap,cost,next;}e[M];int tot=,head[N];
int n,ans,S,T,num,dis[N],id[N],li[N],ri[N],ls[N],rs[N],prev[N],flow[N],q[N*];
bool vis[N];
void add(int x,int y,int z,int cost){
e[++tot].v=y;e[tot].cap=z;e[tot].cost=cost;e[tot].next=head[x];head[x]=tot;
e[++tot].v=x;e[tot].cap=;e[tot].cost=-cost;e[tot].next=head[y];head[y]=tot;
}
void build(int k,int l,int r){
id[k]=++num;
if((li[k]=l)==(ri[k]=r)){
add(id[k],T,,);
return ;
}
int mid=l+r>>;
build(ls[k]=lc,l,mid);
build(rs[k]=rc,mid+,r);
add(id[k],id[ls[k]],inf,);
add(id[k],id[rs[k]],inf,);
}
void insert(int k,int opl,int opr,int now){
if(li[k]==opl&&ri[k]==opr){
add(now,id[k],,);
return ;
}
int mid=li[k]+ri[k]>>;
if(opr<=mid) insert(ls[k],opl,opr,now);
else if(opl>mid) insert(rs[k],opl,opr,now);
else insert(ls[k],opl,mid,now),insert(rs[k],mid+,opr,now);
}
bool spfa(){
for(int i=S;i<=T;i++) vis[i]=,dis[i]=-;
int h=,t=;q[t]=S;dis[S]=;flow[S]=inf;
while(h!=t){
int x=q[++h];vis[x]=;
for(int i=head[x];i;i=e[i].next){
if(e[i].cap&&dis[e[i].v]<dis[x]+e[i].cost){
dis[e[i].v]=dis[x]+e[i].cost;
prev[e[i].v]=i;
flow[e[i].v]=min(flow[x],e[i].cap);
if(!vis[e[i].v]){
vis[e[i].v]=;
if(dis[e[i].v]>dis[x])
q[h--]=e[i].v;
else
q[++t]=e[i].v;
}
}
}
}
return dis[T]!=-;
}
void augment(){
for(int i=T;i!=S;i=e[prev[i]^].v){
e[prev[i]].cap-=flow[T];
e[prev[i]^].cap+=flow[T];
}
ans+=dis[T]*flow[T];
}
int main(){
n=read();S=;T=;
build(,,);
for(int i=,a,b,c;i<=n;i++){
a=read();b=read()-;c=read();
add(S,++num,,c);
insert(,a,b,num);
}
while(spfa()) augment();
printf("%d",ans);
return ;
}
4276: [ONTAK2015]Bajtman i Okrągły Robin的更多相关文章
- BZOJ 4276: [ONTAK2015]Bajtman i Okrągły Robin [线段树优化建边]
4276: [ONTAK2015]Bajtman i Okrągły Robin 题意:\(n \le 5000\)个区间\(l,r\le 5000\),每个区间可以选一个点得到val[i]的价值,每 ...
- BZOJ 4276: [ONTAK2015]Bajtman i Okrągły Robin
最大权值匹配,贪心匈牙利即可. 检查一些人是否能被全部抓住可以采用左端点排序,右端点优先队列处理. By:大奕哥 #include<bits/stdc++.h> using namespa ...
- BZOJ 4276 [ONTAK2015]Bajtman i Okrągły Robin 费用流+线段树优化建图
Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i]]这么多段长度为1时间中选出一个时间进行抢劫,并计划抢 ...
- bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin【线段树+最大费用最大流】
--因为T点忘记还要+n所以选小了所以WA了一次 注意!题目中所给的时间是一边闭一边开的区间,所以读进来之后先l++(或者r--也行) 线段树优化建图,很神.(我记得还有个主席树优化建树的?)首先考虑 ...
- [ONTAK2015]Bajtman i Okrągły Robin
bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin Time Limit: 40 Sec Memory Limit: 256 MB Description 有 ...
- 【BZOJ4276】[ONTAK2015]Bajtman i Okrągły Robin 线段树优化建图+费用流
[BZOJ4276][ONTAK2015]Bajtman i Okrągły Robin Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2 ...
- BZOJ4276 : [ONTAK2015]Bajtman i Okrągły Robin
建立线段树, S向每个叶子连边,容量1,费用0. 孩子向父亲连边,容量inf,费用0. 每个强盗向T连边,容量1,费用为c[i]. 对应区间内的点向每个强盗,容量1,费用0. 求最大费用流即可. #i ...
- Bajtman i Okrągły Robin
Bajtman i Okrągły Robin 题目描述 你是一个保安,你发现有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i] ...
- BZOJ_4276_[ONTAK2015]Bajtman i Okrągły Robin_线段树优化建图+最大费用最大流
BZOJ_4276_[ONTAK2015]Bajtman i Okrągły Robin_线段树优化建图+最大费用最大流 Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1 ...
随机推荐
- hdu 2521 反素数(打表)
反素数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- iOS YYYY 和 yyyy的区别
2017年1月31日 转换后变成 2018年1月31日,相差一年.这是为什么呢? 原因:YYYY 是以周为单位计算的,我们平常计算日期时最好用yyyy,yyyy才是标注的年份 如果一月1日是星期一,星 ...
- (7)JavaScript-BOM(浏览器对象模 型)
window 对象 全局作用域 在浏览器中, window 对象有双重角色,它既是通过 JavaScript 访问浏览器窗口的一个接口,又是 ECMAScript 规定的 Global 对象. 所有在 ...
- 任意选若干个不相邻的数得到的和最大【dp】
非相邻数最大和 ///*任意选若干个不相邻的数得到的和最大*/ #include<cstdio> #include<cstring> #include<queue> ...
- 集合点-Jmeter-集合点详解
集合点:简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存在的,为了更真实的实现并发这感念,我们可以在需要压力的地方设置集合点, 还拿那个用户和密码的地方,每到输入用户 ...
- 盘点支持Orchard的.NET 4.5虚拟主机(虚拟空间)
Orchard作为.NET社区最为先进的开源项目之一,已经被越来越多的人使用, 由于它使用了最时髦的微软技术栈(.NET4.5),因此在 Win2008+和IIS7+ 的环境上运行最为完美, 而win ...
- iOS github大全 & iOS7的学习blog
iOS github大全 :有600多个iOS各方面的开源库,并分类了 一天天学习iOS7 :每天学习一点iOS7的新特性
- 苹果放宽了 iOS 5.0 对应用本地存储的限制
iOS5.0引入了iCloud,让那些需要本地存储较多数据的app开发者(比如支持离线的杂志,新闻类app)陷入了 尴尬的境地,因为将大量数据存储在/Documents 文件夹将导致iCloud同步变 ...
- iOS -- iOS11新特性,如何适配iOS11
前言 这几天抽空把WWDC的Session看了一些,总结了一些iOS11新的特性,可能对我们的App有影响,需要我们进行适配.本文作为一个总结. 本文内容包括:集成了搜索的大标题栏.横向选项卡栏.Ma ...
- linux中nl用法
linux 中nl 命令使用 nl :添加行号打印 -b: 指定行号指定的方式,主要有两种: -b a : 表示不论是否为空行,都同样列出行号 -b t : 如果有空行,则不列出那一行 ...