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]]这么多段长度为1时间进行抢劫,并计划抢走c[i]元。你在一个强盗任何一个作案的时间阻止他,你就可以挽回这个强盗带来的损失。显然,对于每个强盗,你只能挽回一次损失。不幸的是,你在每一段长度为1的时间内最多只能制止一个强盗,那么你最多可以挽回多少损失呢?
输入
第一行包含一个正整数n(1<=n<=5000),表示强盗的个数。
接下来n行,每行包含三个正整数a[i],b[i],c[i](1<=a[i]<b[i]<=5000,1<=c[i]<=10000),依次描述每一个强盗。
输出
输出一个整数,即可以挽回的损失的最大值。
样例输入
4
1 4 40
2 4 10
2 3 30
1 3 20
样例输出
90
提示
注意题面中的时间段跟时间点是不一样的。
solution
考虑网络流
把时间段建成点,强盗也建成点,源点向时间段连边(1,0),强盗向汇点连边(1,0),时间段向强盗连边(1,-C[i]),
然后费用流即可。
然而边最多有5000*5000条,会T。
用线段树优化网络流建图:把时间段开成线段树每个,强盗连对应的节点。
子节点向父节点连边,S向叶子连边
由于一段区间对应线段树上不超过logn段区间,所以边数不超过nlogn
然后就可以了
吐槽数据,一直T
居然卡zkw
优化:
1.线段树不建满
2.把边反着建
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 30005
#define inf 1e9
using namespace std;
int n,co,S,T,tot=1,head[maxn],li,ri,cost;
int d[maxn],flag[maxn],ans,cur[maxn],pre[maxn];
queue<int>q;
struct node{
int id,v,nex,cap,w;
}e[200002];
struct no{
int l,r;
}tree[maxn*4];
int ll[5022],rr[5022],c[5022];
void lj(int t1,int t2,int t3,int t4){
tot++;e[tot].id=t1;e[tot].v=t2;e[tot].cap=t3;e[tot].w=t4;e[tot].nex=head[t1];head[t1]=tot;
}
void build(int k,int L,int R){
tree[k].l=L,tree[k].r=R;
if(L==R){
lj(S,k,1,0);lj(k,S,0,0);
co=max(co,k);
return;
}
int mid=L+R>>1;
build(k*2,L,mid);build(k*2+1,mid+1,R);
lj(k*2,k,mid-L+1,0);lj(k,k*2,0,0);
lj(k*2+1,k,R-mid,0);lj(k,k*2+1,0,0);
}
void jia(int k,int pl){
if(tree[k].l>=li&&tree[k].r<=ri){
lj(k,pl,1,-cost);lj(pl,k,0,cost);
return;}
int mid=tree[k].l+tree[k].r>>1;
if(li<=mid)jia(k*2,pl);
if(ri>mid)jia(k*2+1,pl);
}
bool SPFA()
{
for(int i=1;i<=T;i++)flag[i]=0,d[i]=inf;
d[S]=0;flag[S]=1;q.push(S);
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=e[i].nex){
if(e[i].cap>0&&d[e[i].v]>d[x]+e[i].w){
d[e[i].v]=d[x]+e[i].w;pre[e[i].v]=i;
if(!flag[e[i].v])
{
flag[e[i].v]=1;q.push(e[i].v);
}
}
}
flag[x]=0;
}
if(d[T]==inf)return 0;
int u=pre[T],mi=inf;
while(1)
{
mi=min(e[u].cap,mi);
if(e[u].id==S)break;
u=pre[e[u].id];
}
u=pre[T];
while(1)
{
e[u].cap-=mi;e[u^1].cap+=mi;
if(e[u].id==S)break;
u=pre[e[u].id];
}
ans+=d[T]*mi;
return 1;
}
int main(){
cin>>n;
S=30000,T=30001;
int Max=0;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&ll[i],&rr[i],&c[i]);
rr[i]--;Max=max(Max,rr[i]);
}
build(1,1,Max);
for(int i=1;i<=n;i++){
li=ll[i];ri=rr[i];cost=c[i];
jia(1,co+i);
lj(co+i,T,1,0);lj(T,co+i,0,0);
}
while(SPFA());
cout<<-ans<<endl;
return 0;
}
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]的价值,每 ...
- [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 有 ...
- 4276: [ONTAK2015]Bajtman i Okrągły Robin
4276: [ONTAK2015]Bajtman i Okrągły Robin Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 345 Solved ...
- 【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 ...
- 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--也行) 线段树优化建图,很神.(我记得还有个主席树优化建树的?)首先考虑 ...
- 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 ...
随机推荐
- JS中的async/await的执行顺序详解
虽然大家知道async/await,但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 JavaScript 的 async/await(如果对async/await不熟悉 ...
- 初尝微信小程序1-特点
微信小程序特点:1.不需要下载安装即可使用 2.用户用完即走,不用关心是否安装太多应用 3.应用将无处不在,随时可用 适合开发的小程序类型:1.简单的用完即走的应用 2.低频的应用 3.性能要求不高的 ...
- windows平台下MongoDB安装和环境搭建
下载安装包或者压缩包 添加db存储和日志存储文件夹 添加服务.配置环境变量.启动Mongo 本例:安装路径:D:Program Files/MongoDB 配置文件的路径:D:MongoDB 一.安装 ...
- struts+hibernate+spring整合过程常见问题收集
1.java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor缺少asm-3.3.jar2.java.lang.NoClassDefF ...
- Oracle Analyze
Analyze使用场景 之前很多次都说到,对表的索引等信息进行了增删改之后,需要对表进行analyze更新统计信息,才能使数据库做出最好的执行计划,没有注意到,即使是一张很小的空表,如果进行了字段的增 ...
- 关于小程序 scroll-view中设置scroll-top无效 和小说图书阅读进度条小案例
在最近的项目有做到关于小说阅读的进度条功能,其中用到scroll-view和slider组件,发现scroll-view中的scroll-top在设置值后无效,出现这种情况大概是以下几种问题: 1.s ...
- Android驱动开发5-7总结
Android深度探索5-7章总结 介绍了S3C6410开发板的功能,开发板的不同主要是在烧录嵌入式系统的方式不同,以及如何在此开发板上安装Android.紧接着学到介绍到如何在多种平台,使用多种方式 ...
- 记录一些 FileZillaClient 的基本连接操作
本地主机:Window 10 FileZilla版本:3.39.0 64位 远程主机:CentOS 6.4 需安装FTP服务 小提示:查看CentOS版本命令 # cat /etc/issue Fil ...
- 关于springboot配置文件的另类读取方法
一.背景故事 前阵子我接手了公司另外一个同事手里的项目,项目是用的springboot 写的,但是比较坑的就是这个项目写的有点不伦不类.虽然是用的springboot,但由于他是拿了一堆代码拼凑起 ...
- Zimber 8.8.12卸载后重新安装报错解决办法
1.1 zimber故障处理步骤 1.1.1 现象描述 Running Post Installation Configuration: /opt/zimbra/bin/zmlocalconfig ...