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 ...
随机推荐
- Rust-HayStack
src/main.rs extern crate multipart; extern crate iron; extern crate time; //image converter extern c ...
- HDU 1568 Fibonacci【求斐波那契数的前4位/递推式】
Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Proble ...
- 10.1综合强化刷题 Day1
a[问题描述]你是能看到第一题的 friends 呢.——hja何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为字符串定义了新的权值计算方法.一个字符串由小写字母组成,字符串的权 ...
- STM32命名
STM32产品命名 示例: STM32 F 100 C 6 T 6 B XXX 1 2 3 4 5 6 7 8 9 从上面的料号可以看出以下信息: ST品牌ARM Cortex-Mx系列内核32位超值 ...
- flask的httponly默认值为True
如图flask的app.py里显示app的默认配置,httponly默认值为true,所以如果开发者不修改这个配置的话,攻击者是无法通过xss攻击读取浏览器cookie这部分信息的. Cookie:s ...
- EasyMvc入门教程-基本控件说明(2)定时器
我们有时候希望系统能自动刷新后台数据或者做某个动作,那么定时器的作用就体现出来了. EasyMvc默认提供的服务器可以定时调前端方法与定时调后端方法,先看例子: 定时调客户端事件 实现代码: @Htm ...
- 【GLSL教程】(九)其他说明 【转】
http://blog.csdn.net/racehorse/article/details/6664775 法线矩阵 在很多顶点shader中都用到了gl_NormalMatrix.这里将介绍这个矩 ...
- 【GLSL教程】(二)在OpenGL中使用GLSL 【转】
http://blog.csdn.net/racehorse/article/details/6616256 设置GLSL 这一节讲述在OpenGL中配置GLSL,假设你已经写好了顶点shader和像 ...
- 收藏以下linux查看系统信息的命令
# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# hostname ...
- VS2010 + C#4.0使用 async + await
方法一: 安装官方出的Microsoft.Bcl.Async包 最新发布日期为 2014/4/12,版本1.0.168 (不支持VS2010) 1.解决方案-右键-管理解决方案的NuGet程序包 2. ...