热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BZOJ4276[ONTAK2015]BajtmaniOkr?g?yRobin费用流+线段树优化建图

Description有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],,[b[i]-1,b[i]]这么多段长度为1时间中选出一个时间

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]

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了?所以还是把过了的那个弄上来吧......

  1 #include
  2 #include
  3 #include
  4 #include
  5 #include
  6 #include
  7 #include
  8 #include<set>
  9 #include
 10 #include
 11 #include
 12 #define inf 1e9
 13 using namespace std;
 14 const int MAXN=5005;
 15  
 16 int N,a[MAXN],b[MAXN],c[MAXN],up,low=inf;
 17 struct edge{ int to,next,cap,flow,cost; }E[300005];
 18 int n,s,t,np=0,first[15005],dist[15005],fl[15005];
 19 int mq[15005+5],front,rear;
 20 bool inq[15005];
 21 void add_edge(int u,int v,int cap,int cost)
 22 {
 23     E[++np]=(edge){v,first[u],cap,0,cost};
 24     first[u]=np;
 25     E[++np]=(edge){u,first[v],0,0,-cost};
 26     first[v]=np;
 27 }
 28 int MCMF(){
 29     int maxcost=0,now;
 30     while(1){
 31         memset(dist,0,sizeof(dist));
 32         frOnt=rear=0;
 33         mq[rear++]=s,inq[s]=1;
 34         while(front!=rear){
 35             int i=mq[front++]; if(front>15005) frOnt=0;
 36             inq[i]=0;
 37             for(int p=first[i];p;p=E[p].next){
 38                 int j=E[p].to;
 39                 if(E[p].cap>E[p].flow&&dist[i]+E[p].cost>dist[j]){
 40                     dist[j]=dist[i]+E[p].cost;
 41                     fl[j]=p;
 42                     if(!inq[j]){
 43                         mq[rear++]=j,inq[j]=1;
 44                         if(rear>15005) rear=0;
 45                     }
 46                 }
 47             }
 48         }
 49         if(dist[t]<=0) break;
 50         now=t,maxcost+=dist[t];
 51         while(now!=s){
 52             E[fl[now]].flow++,E[(fl[now]-1^1)+1].flow--;
 53             now=E[(fl[now]-1^1)+1].to;
 54         }
 55     }
 56     return maxcost;
 57 }
 58      
 59 int rt=0,np2=0,lc[10005],rc[10005];
 60 void build(int &now,int L,int R){
 61     now=++np2;
 62     if(L==R){
 63         add_edge(now+N,t,1,0);
 64         return;
 65     }
 66     int m=L+R>>1;
 67     build(lc[now],L,m);
 68     build(rc[now],m+1,R);
 69     add_edge(now+N,lc[now]+N,inf,0);
 70     add_edge(now+N,rc[now]+N,inf,0);
 71 }
 72 void update(int now,int L,int R,int A,int B,int id){
 73     if(A<=L&&R<=B){
 74         add_edge(id,now+N,1,0);
 75         return;
 76     }
 77     int m=L+R>>1;
 78     if(B<=m) update(lc[now],L,m,A,B,id);
 79     else if(A>m) update(rc[now],m+1,R,A,B,id);
 80     else update(lc[now],L,m,A,B,id),update(rc[now],m+1,R,A,B,id);
 81 }
 82  
 83 void _scanf(int &x)
 84 {
 85     x=0;
 86     char ch=getchar();
 87     while(ch<0||ch>9) ch=getchar();
 88     while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
 89 }
 90 void data_in()
 91 {
 92     _scanf(N);
 93     for(int i=1;i<=N;i++){
 94         _scanf(a[i]);_scanf(b[i]);_scanf(c[i]);
 95         up=max(up,b[i]),low=min(low,a[i]);
 96     }
 97 }
 98 void work()
 99 {
100     n=2*(up-low)+N+5,s=n-1,t=n;
101     build(rt,low,up-1);
102     for(int i=1;i<=N;i++){
103         update(rt,low,up-1,a[i],b[i]-1,i);
104         add_edge(s,i,1,c[i]);
105     }
106     printf("%d\n",MCMF());
107 }
108 int main()
109 {
110     data_in();
111     work();
112     return 0;
113 }

BZOJ 4276 [ONTAK2015]Bajtman i Okr?g?y Robin 费用流+线段树优化建图


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
author-avatar
此恨缠绵_793
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有