Description

有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i]]这么多段长度为1时间中选出一个时间进行抢劫,并计划抢走c[i]元。作为保安,你在每一段长度为1的时间内最多只能制止一个强盗,那么你最多可以挽回多少损失呢?

Input

第一行包含一个正整数n(1<=n<=5000),表示强盗的个数。
接下来n行,每行包含三个正整数a[i],b[i],c[i](1<=a[i]<b[i]<=5000,1<=c[i]<=10000),依次描述每一个强盗。

Output

输出一个整数,即可以挽回的损失的最大值。

Sample Input

4
1 4 40
2 4 10
2 3 30
1 3 20

Sample Output

90
 
 
 
分析:
  很容易看出来一个网络流的模型,但是暴力建图一点未来都没有......
  注意到强盗出现的时间是一个连续的区间,于是可以用线段树来优化建图。(好操作啊!)

  建图:
  ·源点S,汇点T。
  ·S向所有的小偷连边,容量为1,费用为c[i]。
  ·所有小偷向对应区间连边,容量为1,费用为0。
  ·线段树的叶子向T连边,容量为1,费用为0。
  ·线段树中的点向其左右儿子连边,容量为inf,费用为0。

  最大流最大费就是答案。

  But,卡常卡死我了......

  注意两点(滑稽):

  1、为了小常数,以后网络流边的结构体不要定义from这个变量。

  2、当你想要卡常的时候,注意不要用结构体去套你的算法......全部东西都用数组吧......

  3、我也不知道为什么本机上最快的数组版本上去就T了?所以还是把过了的那个弄上来吧......

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
#define inf 1e9
using namespace std;
const int MAXN=; int N,a[MAXN],b[MAXN],c[MAXN],up,low=inf;
struct edge{ int to,next,cap,flow,cost; }E[];
int n,s,t,np=,first[],dist[],fl[];
int mq[+],front,rear;
bool inq[];
void add_edge(int u,int v,int cap,int cost)
{
E[++np]=(edge){v,first[u],cap,,cost};
first[u]=np;
E[++np]=(edge){u,first[v],,,-cost};
first[v]=np;
}
int MCMF(){
int maxcost=,now;
while(){
memset(dist,,sizeof(dist));
front=rear=;
mq[rear++]=s,inq[s]=;
while(front!=rear){
int i=mq[front++]; if(front>) front=;
inq[i]=;
for(int p=first[i];p;p=E[p].next){
int j=E[p].to;
if(E[p].cap>E[p].flow&&dist[i]+E[p].cost>dist[j]){
dist[j]=dist[i]+E[p].cost;
fl[j]=p;
if(!inq[j]){
mq[rear++]=j,inq[j]=;
if(rear>) rear=;
}
}
}
}
if(dist[t]<=) break;
now=t,maxcost+=dist[t];
while(now!=s){
E[fl[now]].flow++,E[(fl[now]-^)+].flow--;
now=E[(fl[now]-^)+].to;
}
}
return maxcost;
} int rt=,np2=,lc[],rc[];
void build(int &now,int L,int R){
now=++np2;
if(L==R){
add_edge(now+N,t,,);
return;
}
int m=L+R>>;
build(lc[now],L,m);
build(rc[now],m+,R);
add_edge(now+N,lc[now]+N,inf,);
add_edge(now+N,rc[now]+N,inf,);
}
void update(int now,int L,int R,int A,int B,int id){
if(A<=L&&R<=B){
add_edge(id,now+N,,);
return;
}
int m=L+R>>;
if(B<=m) update(lc[now],L,m,A,B,id);
else if(A>m) update(rc[now],m+,R,A,B,id);
else update(lc[now],L,m,A,B,id),update(rc[now],m+,R,A,B,id);
} void _scanf(int &x)
{
x=;
char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
void data_in()
{
_scanf(N);
for(int i=;i<=N;i++){
_scanf(a[i]);_scanf(b[i]);_scanf(c[i]);
up=max(up,b[i]),low=min(low,a[i]);
}
}
void work()
{
n=*(up-low)+N+,s=n-,t=n;
build(rt,low,up-);
for(int i=;i<=N;i++){
update(rt,low,up-,a[i],b[i]-,i);
add_edge(s,i,,c[i]);
}
printf("%d\n",MCMF());
}
int main()
{
data_in();
work();
return ;
}

BZOJ 4276 [ONTAK2015]Bajtman i Okrągły Robin 费用流+线段树优化建图的更多相关文章

  1. 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]的价值,每 ...

  2. BZOJ 4276: [ONTAK2015]Bajtman i Okrągły Robin

    最大权值匹配,贪心匈牙利即可. 检查一些人是否能被全部抓住可以采用左端点排序,右端点优先队列处理. By:大奕哥 #include<bits/stdc++.h> using namespa ...

  3. bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin【线段树+最大费用最大流】

    --因为T点忘记还要+n所以选小了所以WA了一次 注意!题目中所给的时间是一边闭一边开的区间,所以读进来之后先l++(或者r--也行) 线段树优化建图,很神.(我记得还有个主席树优化建树的?)首先考虑 ...

  4. 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 ...

  5. [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 有 ...

  6. 【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 ...

  7. BZOJ4276 : [ONTAK2015]Bajtman i Okrągły Robin

    建立线段树, S向每个叶子连边,容量1,费用0. 孩子向父亲连边,容量inf,费用0. 每个强盗向T连边,容量1,费用为c[i]. 对应区间内的点向每个强盗,容量1,费用0. 求最大费用流即可. #i ...

  8. 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 ...

  9. 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. 关于ProjectServer定制化项目中心页面

    ProjectServer界面很多客户接受不了,随便用户可以根据自己需要展示页面,但大多数国内用户喜欢确定的样式,我就是要这样的页面,不要个人定制. 那只有自己再做一个项目中心的webpart嵌入,对 ...

  2. 20.springboot项目部署到linux服务器文件上传临时路径处理问题

    1.前言 把项目部署到服务器上之后,文件上传默认会在/tmp路径中. 之前想了各种解决办法,比如如何更改这个上传路径...... 最后发现不是个好的方法,当然就想到了更好的解决方案. 就是我把上传文件 ...

  3. JVM垃圾回收补充知识点

    1. 分代 虚拟机中的共划分为三个代: 年轻代(Young Gen):eden和survivor-8:1:1 年老代(Old Gen):存储大对象,由survivor晋升 永久代(perm Gen): ...

  4. 访问oracle数据库

    如果是本地 :sqlplus system/xxx(用户名/密码) 远程到服务器, sqlplus system/xxx(用户名/密码) @IP:port/orcl(orcl为数据库实例)

  5. jsp页面的传值(popup)

    jsp页面与xml文件对应的关系: 例:网页上jsp的url为----purchase_app_btn.do? 对应xml文件下的 <action path="/purchase_ap ...

  6. ios学习路线—Objective-C(堆(heap)和栈(stack))

    Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,即release 栈由编译器管理自动释放的,在方法中(函数体)定义的变量通常是在栈内,因此如果你的变量要跨函数的话就 ...

  7. ansible服务的部署与使用

      简介:   ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序 ...

  8. Django---URL、Views

    1.Django URL(路由系统) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Djang ...

  9. 3.2 进程间通信之fifo

    一.引言 FIFO常被称为有名管道,不同于管道(pipe).pipe仅适用于“有血缘关系”的IPC.但FIFO还可以应用于不相关的进程的IPC.实际上,FIFO是Linux基础文件类型中的一种,是在读 ...

  10. u-boot-2016.01移植(一)

    1.了解uboot: 阅读uboot源码顶层目录下的README.TXT可以提取如下信息:     made to support booting of Linux images.   //引导内核程 ...