Description

现在有一堆手机放在坐标网格里面(坐标从1开始),坐标(i,j)的格子有s_(i,j)个手机。
玩手机当然需要有信号,不过这里的手机与基站与我们不太一样。基站分为两种:发送站和接收站(以下简称为A站和B站)。每个手机必须同时与一个A站和一个B站通信才能工作。
每个基站有一个正方形的覆盖范围(平行于网格)。覆盖范围可以用左下角和右上角的坐标表示(范围包括边角)。显然,手机只有在某个基站的范围内才能与这个基站通信。除此之外,每个基站还有最大接入的手机数量限制。
求最大同时工作的手机数量。

Input

第一行四个整数R,C,a,b,表示坐标网格的规模是R×C,共有a个A站和b个B站。
接下来是一个R×C的矩阵,第i行第j列的数为s_(i,j)。
接下来a行,每行5个数w,x1,y1,x2,y2,表示第i个A站最大接入w个手机,覆盖范围为(x1,y1)~(x2,y2)。
接下来b行,每行5个数w,x1,y1,x2,y2,含义同上。

Output

一个整数,即最大同时工作的手机数量。

Sample Input

3 3 1 2
1 1 1
1 1 1
1 1 1
100 1 1 3 3
4 1 1 2 2
4 2 2 3 3

Sample Output

7

数据规模与约定
1≤R,C≤60,0≤a,b≤10,000,0≤s,w≤10,000,1≤x1≤x2≤R,1≤y1≤y2≤C。

Solution

朴素的网络流应该很简单,直接$r \times c$的每个格子拆点,左边连$a$基站右边连$b$基站,然后$a$基站连源点,$b$基站连汇点就好了。

但是这样的话会边数爆炸,所以可以用二维$ST$表优化连边。具体的可以看$Claris$神仙的博客QwQ

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define N (300009)
#define INF (0x7f7f7f7f)
using namespace std; struct Edge{int to,next,flow;}edge[N<<];
int r,c,a,b,w,x,y,u,v,id_num,val,s,t=;
int Depth[N],f[][][],g[][][],LOG2[];
int head[N],num_edge;
queue<int>q; void add(int u,int v,int l)
{
edge[++num_edge]=(Edge){v,head[u],l}; head[u]=num_edge;
edge[++num_edge]=(Edge){u,head[v],}; head[v]=num_edge;
} int DFS(int x,int low,int t)
{
if (x==t || !low) return low;
int f=;
for (int i=head[x]; i; i=edge[i].next)
if (Depth[edge[i].to]==Depth[x]+)
{
int Min=DFS(edge[i].to,min(low,edge[i].flow),t);
edge[i].flow-=Min;
edge[((i-)^)+].flow+=Min;
f+=Min; low-=Min;
if (!low) break;
}
if (!f) Depth[x]=-;
return f;
} bool BFS(int s,int t)
{
memset(Depth,,sizeof(Depth));
Depth[s]=;
q.push(s);
while (!q.empty())
{
int x=q.front(); q.pop();
for (int i=head[x]; i; i=edge[i].next)
if (!Depth[edge[i].to] && edge[i].flow)
{
Depth[edge[i].to]=Depth[x]+;
q.push(edge[i].to);
}
}
return Depth[t];
} int Dinic(int s,int t)
{
int ans=;
while (BFS(s,t))
ans+=DFS(s,INF,t);
return ans;
} int main()
{
for (int i=; i<=; ++i) LOG2[i]=LOG2[i>>]+;
scanf("%d%d%d%d",&r,&c,&a,&b);
for (int i=; i<=r; ++i)
for (int j=; j<=c; ++j)
{
scanf("%d",&val);
f[i][j][]=++id_num; g[i][j][]=++id_num;
add(f[i][j][],g[i][j][],val);
}
for(int k=; k<; ++k)
for(int i=; i<=r; ++i)
for(int j=; j<=c; ++j)
if(i+(<<k)-<=r && j+(<<k)-<=c)
{
f[i][j][k]=++id_num; g[i][j][k]=++id_num;
add(f[i][j][k],f[i][j][k-],INF); add(g[i][j][k-],g[i][j][k],INF);
add(f[i][j][k],f[i+(<<k-)][j][k-],INF); add(g[i+(<<k-)][j][k-],g[i][j][k],INF);
add(f[i][j][k],f[i][j+(<<k-)][k-],INF); add(g[i][j+(<<k-)][k-],g[i][j][k],INF);
add(f[i][j][k],f[i+(<<k-)][j+(<<k-)][k-],INF); add(g[i+(<<k-)][j+(<<k-)][k-],g[i][j][k],INF);
}
for (int i=; i<=a; ++i)
{
scanf("%d%d%d%d%d",&w,&x,&y,&u,&v);
add(s,++id_num,w);
int k=LOG2[u-x+];
add(id_num,f[x][y][k],INF);
add(id_num,f[x][v-(<<k)+][k],INF);
add(id_num,f[u-(<<k)+][y][k],INF);
add(id_num,f[u-(<<k)+][v-(<<k)+][k],INF);
} for (int i=; i<=b; ++i)
{
scanf("%d%d%d%d%d",&w,&x,&y,&u,&v);
add(++id_num,t,w);
int k=LOG2[u-x+];
add(g[x][y][k],id_num,INF);
add(g[x][v-(<<k)+][k],id_num,INF);
add(g[u-(<<k)+][y][k],id_num,INF);
add(g[u-(<<k)+][v-(<<k)+][k],id_num,INF);
}
printf("%d\n",Dinic(s,t));
}

BZOJ3577:玩手机(最大流,二维ST表)的更多相关文章

  1. BZOJ1047[HAOI2007]理想的正方形——二维ST表

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...

  2. 【CodeForces】713 D. Animals and Puzzle 动态规划+二维ST表

    [题目]D. Animals and Puzzle [题意]给定n*m的01矩阵,Q次询问某个子矩阵内的最大正方形全1子矩阵边长.n,m<=1000,Q<=10^6. [算法]动态规划DP ...

  3. 【洛谷 P2216】 [HAOI2007]理想的正方形(二维ST表)

    题目链接 做出二维\(ST\)表,然后\(O(n^2)\)扫一遍就好了. #include <cstdio> #include <cstring> #include <a ...

  4. Codeforces 713D Animals and Puzzle(二维ST表+二分答案)

    题目链接 Animals and Puzzle 题意  给出一个1e3 * 1e3的01矩阵,给出t个询问,每个询问形如x1,y1,x2,y2 你需要回答在以$(x1, y1)$为左上角,$(x1, ...

  5. [模板]二维ST表

    考试yy二维ST表失败导致爆零. 其实和一维的ST表很像... 也是设$f[i][j][p][q]$为以$(i, j)$为左上角,长为$2^p$,宽为$2^q$的矩形的最大值. 算法流程是先把每一行都 ...

  6. [HNOI2007] 理想正方形 二维ST表

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...

  7. [总结] 二维ST表及其优化

    二维 \(\mathcal{ST}\) 表,可以解决二维 \(\mathcal{RMQ}\) 问题.这里不能带修改,如果要修改,就需要二维线段树解决了. 上一道例题吧 ZOJ2859 类比一维 \(\ ...

  8. hdu2888 二维ST表(RMQ)

    二维RMQ其实和一维差不太多,但是dp时要用四维 /* 二维rmq */ #include<iostream> #include<cstring> #include<cs ...

  9. 数据结构:二维ST表

    POJ2019 我们其实是很有必要把ST算法拓展到二维的,因为二维的RMQ问题还是不少的 int N,B,K; ]; int val[maxn][maxn]; ][]; ][]; 这里的N是方阵的长宽 ...

随机推荐

  1. C#设计模式之五原型模式(Prototype Pattern)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  2. linux下ftp服务器搭建

    1.yum install vsftpd  使用yum安装ftp 2.创建并授权ftp文件目录   mkdir -P /ftp/ftpadmin       chmod -R 777 /ftp/ftp ...

  3. JavaScript 中的相等操作符 ( 详解 [] == []、[] == ![]、{} == !{} )

    ECMAScript 中的相等操作符由两个等于号 ( == ) 表示,如果两个操作数相等,则返回 true. 相等操作符会先转换操作数(通常称为强制转型),然后比较它们的相等性. 在转换不同的数据类型 ...

  4. POJ1743 Musical Theme(后缀数组 二分)

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 33462   Accepted: 11124 Description A m ...

  5. c#无边框窗体移动

    [DllImport("user32.dll")]//拖动无窗体的控件 public static extern bool ReleaseCapture(); [DllImport ...

  6. 电脑GIF动图制作方法图文详解

    我们在电脑上可以看到很多动态图,有趣的.搞笑的.可爱的等等,只要我们要用哪种类型的,网上应有尽有,但是想不想自己制作图片呢?今天我们就来学习一下GIF动图制作的方法. 使用工具: 电脑 操作方法: 1 ...

  7. GIS开发之计算四参数,七参数

    一.四参数 想要通过控制点计算四参数,首先需要知道四参数的相关原理,推荐这篇文章: http://www.docin.com/p-1197326043.html 根据上面的计算公式,使用最小二乘法计算 ...

  8. chrome离线包出现的小问题

    网友使用离线包时出现的一些小问题,在此做个记录: 1. @200258 这个版本就是个坑.chrome低版本显示空白,高版本界面乱掉,有反馈出54可以,有说56可以 亲测:即使不用离线包直接FQ,也会 ...

  9. Kotlin入门(25)共享参数模板

    共享参数SharedPreferences是Android最简单的数据存储方式,常用于存取“Key-Value”键值对数据.在使用共享参数之前,要先调用getSharedPreferences方法声明 ...

  10. HTML+JS+JQuery不可以使用status

    可能是JQuery的内部定义了status的原因!在HTML中的元素如果声明了ID为status的话,脚本中是不能访问这个对象的,会成为一个字符串对象.