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. SpringMvc获取上下文

    import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.spri ...

  2. 经验之谈—控制器的view的显示

    经验之谈—控制器的view的显示 开发中,我们经常需要将一个控制器的view添加到另一个控制器的view上,这种效果是我们期望看到的,但是里边隐藏着一些细节,不注意的话,可能会达不到我们想到的效果. ...

  3. 自定义App首次启动引导页

    代码如下 #import"ZBGuidePageView.h" @interfaceZBGuidePageView()<UIScrollViewDelegate> @p ...

  4. C++中vector,set,map自定义排序

    一.vector排序 vector支持cmp,就类似数组,可以直接sort. #include <iostream> #include <algorithm> #include ...

  5. django项目创建requirements.txt文件

    workon+虚拟环境名 然后输入 pip freeze > requirements.txt

  6. dom4j解析器sax解析xml文件

    1.使用dom4j解析器解析xml ***解析器dom4j是由dom4j组织提供的,针对xml进行解析.dom4j不是Javase的一部分,使用时需要导入dom4j的jar包(官网下载) 在eclip ...

  7. Flask之endpoint错误View function mapping is overwriting an existing endpoint function: ***

    最近在学习Flask, 其中遇到了一个错误, 发现这个问题和Flask, 路由有关系, 所以就记了下来 错误代码: from flask import Flask, render_template, ...

  8. YII2.0学习一 Advanced 模板安装

    下载github上的完事安装包(本机环境使用Composer安装非常慢) https://github.com/yiisoft/yii2-app-advanced 解压到文件目录 wwwroot/sh ...

  9. 终于搞定了cxgrid的多行表头(转终于搞定了cxgrid的多行表头 )

    终于搞定了cxgrid的多行表头 转自:http://mycreature.blog.163.com/blog/static/556317200772524226400/     这一周都在处理dbg ...

  10. liunx下搭建python开发环境

    =============================================================================注意: 在linux下安装新的版本的pytho ...