线段树优化建图+费用流

朴素的做法是每个强盗直接对每个区间的每个点连边,然后跑最大权匹配,这样有5000*5000条边,肯定过不去,那么我们用线段树优化一下,因为线段树能把一个O(n)的区间划分为O(logn)段

然后就建一棵线段树,每个节点向两个儿子连(inf,0)的边,叶子结点连向sink,(1,0),每个强盗向对应区间节点连边,这样边数就将为了nlogn条。据说正解是贪心?

抄了个板子

#include<bits/stdc++.h>
using namespace std;
const int N = , inf = 0x3f3f3f3f;
struct edge {
int nxt, to, f, c;
} e[N * ];
int n, m, k, source, sink, tot, cnt = , sum;
int head[N], pree[N], prev[N], vis[N], d[N];
inline void link(int u, int v, int f, int c)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].f = f;
e[cnt].to = v;
e[cnt].c = c;
}
inline void insert(int u, int v, int f, int c)
{
link(u, v, f, c);
link(v, u, , -c);
}
bool spfa()
{
memset(d, -, sizeof(d));
d[source] = ;
queue<int> q;
q.push(source);
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = ;
for(int i = head[u]; i; i = e[i].nxt) if(e[i].f && (d[e[i].to] < d[u] + e[i].c || d[e[i].to] == -))
{
pree[e[i].to] = i;
prev[e[i].to] = u;
d[e[i].to] = d[u] + e[i].c;
if(vis[e[i].to] == )
{
q.push(e[i].to);
vis[e[i].to] = ;
}
}
}
return d[sink] != -;
}
inline int Edmonds_Karp()
{
int ans = ;
while(spfa())
{
int now = sink, delta = inf;
while(now != source)
{
delta = min(delta, e[pree[now]].f);
now = prev[now];
}
now = sink;
while(now != source)
{
e[pree[now]].f -= delta;
e[pree[now] ^ ].f += delta;
now = prev[now];
}
ans += delta * d[sink];
}
return ans;
}
void build(int l, int r, int x)
{
if(l == r)
{
insert(x, sink, , );
return;
}
int mid = (l + r) >> ;
build(l, mid, x << );
build(mid + , r, x << | );
insert(x, x << , inf, );
insert(x, x << | , inf, );
}
void update(int l, int r, int x, int a, int b, int c, int pos)
{
if(l > b || r < a) return;
if(l >= a && r <= b)
{
insert(pos, x, , c);
return;
}
int mid = (l + r) >> ;
update(l, mid, x << , a, b, c, pos);
update(mid + , r, x << | , a, b, c, pos);
}
int main()
{
scanf("%d", &n);
sink = + n + ;
build(, , );
for(int i = ; i <= n; ++i)
{
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
insert(source, i + , , );
update(, , , l, r - , c, i + );
}
printf("%d\n", Edmonds_Karp());
return ;
}

最新文章

  1. EntityFramework.Extended 支持 MySql
  2. ubuntu下增加中文编码
  3. Spark随笔(二):深入学习
  4. LeetCode题解-----Majority Element II 摩尔投票法
  5. List排序忽略大小写
  6. intelliJ idea读取资源文件
  7. seleniumRC启动及浏览器实例配置
  8. 如何改变dreamweaver的编码方式
  9. ecshop 调用其他数据库中的商品
  10. bzoj4010: [HNOI2015]菜肴制作【拓扑排序】
  11. iOS 转场动画探究(二)
  12. js随机数生成,生成m-n的随机数
  13. Flask项目笔记
  14. 【Big Data - Hadoop - MapReduce】初学Hadoop之图解MapReduce与WordCount示例分析
  15. [No0000146]深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing)理解堆与栈3/4
  16. DAY2-Python学习笔记
  17. 使用Nmap攻击靶机和使用Wireshark进行嗅探、分析
  18. XAF 如何从Excel复制多个单元格内容到GridView(收藏)
  19. 动态加载和卸载 DLL
  20. KNN算法实现

热门文章

  1. PHP中的字符串替换(str_replace)
  2. C++内存分配方式(——选自:C++内存管理技术内幕)
  3. vagrant的学习 之 Laravel
  4. jquery的ajax提交时“加载中”提示的处理方法
  5. poj3635 FULL tank(TLE) 有限制的最短路(BFS搜索)。
  6. HDU 6441 费马大定理+勾股数
  7. VMware虚拟机上安装linux和克隆
  8. Angular2.x-服务
  9. CxImage的编译及简单使用举例
  10. vue 自定义 移动端筛选条件