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. 金s办公软件web前端笔试题

    1. var arr = []; arr['a'] = 1; console.log(arr.length); // A arr['4'] = 2; console.log(arr.length); ...

  2. 分布式id生成

    2016年08月09日 14:15:21 yuanyuanispeak 阅读数:318 编辑 一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id ...

  3. java中的==、equals()源码分析

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  4. Mysql8.0 3306端口无法远程连接

    在阿里云上搭建MySql8.0数据库服务,在阿里云上可以成功连接登陆使用,但用自己的电脑远程连接时却无法成功连接 经过资料查找,找出原因如下: 1.首先通过查看MySQL的的用户信息 可以看到host ...

  5. sql server,mysql,oracle平时用法的区别

    由于工作的原因,上家公司一直使用的oracle,后来接触了的几个项目,既有使用mysql的又有使用sqlserver,自己在使用sqlserver及mysql要实现某功能时,经常要在网上找来找去,所以 ...

  6. vue服务端渲染提取css

    vue服务端渲染,提取css单独打包的好处就不说了,在这里主要说的是抽取css的方法 要从 *.vue 文件中提取 CSS,可以使用 vue-loader 的 extractCSS 选项(需要 vue ...

  7. Java : java基础(3) IO流

    流按操作类型分为两种,字节流,字符流,按流向分为输入流,输出流,输入流的抽象父类InputStream,输出流抽象父类OutputStream,字符流的抽象父类是Reader和Writer 一般用字节 ...

  8. php中处理中文的注意

    使用session的情况下------------------------- php.ini register_globals = Off 保持关闭,开启可能会导致iconv转换中文产生错误 修改ph ...

  9. Hadoop(5)-HDFS概述

    HDFS产生背景 HDFS优缺点 HDFS组成架构 HDFS文件块大小

  10. Django的aggregate()和annotate()函数的区别

    aggregate() aggregate()为所有的QuerySet生成一个汇总值,相当于Count().返回结果类型为Dict. annotate() annotate()为每一个QuerySet ...