很明显网络流。

S到每个发射站连边,容量为该站限制

每个接收站到T连边,容量为该站限制

矩阵每个点拆成两个点i和i',i向i'连边,容量为该位置手机数

每个发射站向该正方形内所有点i连边,容量为无穷大

每个接收站向该正方形内所有点i'连边,容量为无穷大

求最大流即可。

但是这样的话,TLE+MLE(内存限制只有32M)

可以发现每个站点连出去的都是一个正方形,所以有种神奇的优化方法

跟A+B Problem类似,那道题是每次连的一定是个区间,所以建立线段树后用一个点代表一个区间,父节点向儿子节点连边

这题也类似,不过因为连得容量都是无穷大,所以[1,10]这个区间即使被拆成[1,8][2,10]都不影响答案,

所以可以用二维ST表来优化,

fs[i][j][k]表示左上角为(i,j),边长为$2^k$的正方形所代表的点的ID

ft[i][j][k]表示左上角为(i,j),边长为$2^k$的正方形所代表的点拆点后另一个点的ID

很明显fs[i][j][0]要向ft[i][j][0]连边,容量为(i,j)处手机数量

然后是预处理

fs[i][j][k]

fs[i][j][k-1]

fs[i+2^(k-1)-1][j][k-1]

fs[i][j+2^(k-1)-1][k-1]

fs[i+2^(k-1)-1][j+2^(k-1)-1][k-1]

连边,容量为无穷大

ft[i][j][k-1]

ft[i+2^(k-1)-1][j][k-1]

ft[i][j+2^(k-1)-1][k-1]

ft[i+2^(k-1)-1][j+2^(k-1)-1][k-1]

ft[i][j][k]

连边,容量为无穷大

对于每个发射站,

fs[x1][y1][log(边长)]

fs[x1][y2-2^log(边长)+1][log(边长)]

fs[x2-2^log(边长)+1][y1][log(边长)]

fs[x2-2^log(边长)+1][y2-2^log(边长)+1][log(边长)]

连边,容量为无穷大

对于每个接收站,

ft[x1][y1][log(边长)]

ft[x1][y2-2^log(边长)+1][log(边长)]

ft[x2-2^log(边长)+1][y1][log(边长)]

ft[x2-2^log(边长)+1][y2-2^log(边长)+1][log(边长)]

向它连边,容量为无穷大

这样点数是$n^2\log n+a+b$,边数是$n^2\log n+a+b$,就可以过了

#include<cstdio>
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
const int N=56010,inf=~0U>>2;
int n,S,T,h[N],gap[N],maxflow;
struct edge{int t,f;edge *nxt,*pair;}*g[N],*d[N];
int r,c,a,b,x1,x2,y1,y2,w;
int i,j,k,fs[62][62][6],ft[62][62][6],pow[8],log[62];
inline int min(int a,int b){return a<b?a:b;}
inline void add(int s,int t,int f){
edge *p=new(edge);p->t=t;p->f=f;p->nxt=g[s];g[s]=p;
p=new(edge);p->t=s;p->f=0;p->nxt=g[t];
g[t]=p;g[s]->pair=g[t];g[t]->pair=g[s];
}
int sap(int v,int flow){
if(v==T)return flow;
int rec=0;
for(edge *p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+1&&p->f){
int ret=sap(p->t,min(flow-rec,p->f));
p->f-=ret;p->pair->f+=ret;d[v]=p;
if((rec+=ret)==flow)return flow;
}
d[v]=g[v];
if(!(--gap[h[v]]))h[S]=T;
gap[++h[v]]++;
return rec;
}
int main(){
for(pow[0]=i=1;i<8;i++)pow[i]=pow[i-1]<<1;
for(i=1;i<62;i++)for(j=i;j>1;j>>=1,log[i]++);
read(r);read(c);read(a);read(b);
for(i=1;i<=r;i++)for(j=1;j<=c;j++){
fs[i][j][0]=++n,ft[i][j][0]=++n;
read(k);
add(fs[i][j][0],ft[i][j][0],k);
}
for(k=1;k<6;k++)for(i=1;i<=r;i++)for(j=1;j<=c;j++)if(i+pow[k]-1<=r&&j+pow[k]-1<=c){
fs[i][j][k]=++n,ft[i][j][k]=++n;
add(fs[i][j][k],fs[i][j][k-1],inf),add(ft[i][j][k-1],ft[i][j][k],inf);
add(fs[i][j][k],fs[i+pow[k-1]][j][k-1],inf),add(ft[i+pow[k-1]][j][k-1],ft[i][j][k],inf);
add(fs[i][j][k],fs[i][j+pow[k-1]][k-1],inf),add(ft[i][j+pow[k-1]][k-1],ft[i][j][k],inf);
add(fs[i][j][k],fs[i+pow[k-1]][j+pow[k-1]][k-1],inf),add(ft[i+pow[k-1]][j+pow[k-1]][k-1],ft[i][j][k],inf);
}
S=n+a+b+1;T=S+1;
while(a--){
read(w),read(x1),read(y1),read(x2),read(y2);
add(S,i=++n,w);
k=log[j=x2-x1+1];
add(i,fs[x1][y1][k],inf);
add(i,fs[x1][y2-pow[k]+1][k],inf);
add(i,fs[x2-pow[k]+1][y1][k],inf);
add(i,fs[x2-pow[k]+1][y2-pow[k]+1][k],inf);
}
while(b--){
read(w),read(x1),read(y1),read(x2),read(y2);
add(i=++n,T,w);
k=log[j=x2-x1+1];
add(ft[x1][y1][k],i,inf);
add(ft[x1][y2-pow[k]+1][k],i,inf);
add(ft[x2-pow[k]+1][y1][k],i,inf);
add(ft[x2-pow[k]+1][y2-pow[k]+1][k],i,inf);
}
gap[0]=T;
for(i=0;i++<T;)d[i]=g[i];
while(h[S]<T)maxflow+=sap(S,inf);
printf("%d",maxflow);
return 0;
}

  

BZOJ3577 : 玩手机的更多相关文章

  1. BZOJ3577:玩手机(最大流,二维ST表)

    Description 现在有一堆手机放在坐标网格里面(坐标从1开始),坐标(i,j)的格子有s_(i,j)个手机. 玩手机当然需要有信号,不过这里的手机与基站与我们不太一样.基站分为两种:发送站和接 ...

  2. Uber能知道你是不是在开车的时候玩手机

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. 生活问题 | 对华为畅玩手机5X进行升级

    步骤一:准备一张SD卡,建议使用Sandisk, Kingstone, 或Kingmax,大小建议在2G KIW-AL10C00B258 软件版本升级指导书 Secret  2016-11-25 Hu ...

  4. 浅谈 PHP 与手机 APP 开发(API 接口开发) -- 转载

    转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因 ...

  5. Andy - 又一款速度流畅的免费安卓 Android 模拟器 (支持手机无线控制电脑模拟器)

    随着 Genymotion.BlueStacks 等电脑上的 Android 模拟器流行起来之后,似乎很多人都发现在电脑上运行使用安卓APP软件.畅玩手机游戏确实很有乐趣. 今天我们又发现了一款全新免 ...

  6. 浅谈 PHP 与手机 APP 开发(API 接口开发)

    本文内容转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人一.先简单回答两个问题:1.PHP 可以开发客户端?答:不可以, ...

  7. 浅谈PHP与手机APP开发(API接口开发)

    了解PHP与API开发 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:服务端的开发.(别去纠结 GTK ...

  8. [cocos2dx]怎样将Android手机游戏移植到电视?

    近期智能电视很火,我也买了一个小米电视,看片效果不错,网络也还算给力.可是,玩游戏比較蛋疼,要用遥控器,下了一个捕鱼达人试玩了一把,要用方向键控制大炮的方向和远近,再用确定键发射炮弹,根本没法玩... ...

  9. 新辰:4G时代怎样利用手机进行移动APP营销?

    未来的时代是4G时代,新辰手机用户的搜索量不在电脑端之下.那么,我们要怎样用手机进行营销呢?手机站点的竞价文章,要怎样去写比較好?手机站点要做专题吗?手机站点的优化思路在哪里?手机的系统不同,在不同的 ...

随机推荐

  1. 跟着百度学PHP[1]-if条件嵌套

    权当自己的学习笔记.望大牛们切勿参考.如若发现错误,万望指出!  慕课任务 假设在发工资的时候,不仅判定性别,还要判定男性是否有房,没有房,可以发放住房补贴,对于女性,判定是否怀孕,怀孕还有怀孕补贴. ...

  2. python - PyQuery

    偶尔的机会,知道这么个扩展,手贱翻了下文档,发现似乎挺有意思,遂记录一二. what: 这是一个python版本的jquery,而且是后端执行的,至少官方是这么说的: pyquery allows y ...

  3. encode与decode,unicode与中文乱码的问题

    encode是指将unicode字符编码成其他字符集的字符,如utf-8,ascii等: 而decode是指将其他字符编码,如utf-8转换成unicode编码. encode是指将人类用的语言(字符 ...

  4. Java--多线程读取网络图片并保存在本地

    本例用到了多线程.时间函数.网络流.文件读写.正则表达式(在读取html内容response时,最好不要用正则表达式来抓捕html文本内容里的特征,因为服务器返回的多个页面的文本内容不一定使用相同的模 ...

  5. Heap(堆)和stack(栈)有的区别是什么。

    java的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个 ...

  6. QEMU 使用的镜像文件:qcow2 与 raw

    qcow2 的基本原理 qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像.它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘.与普通的 raw 格式的镜像相比,有以下特性: 更小的空间 ...

  7. java中四种阶乘的计算

    package com.zf.s2;//创建一个包   import java.math.BigInteger;//导入类 import java.util.ArrayList; import jav ...

  8. Apple Swift中英文开发资源集锦[apple swift resources]

    找到的一些Apple Swift中英文资源原文链接,希望对大家有所帮助.欢迎大家补充,原始资源链接最好! The Swift Programming Language https://develope ...

  9. Android 向Application对象添加Activity监听

    可以建立对象把Application.ActivityLifecycleCallbacks接口中的函数实现,并利用public void registerActivityLifecycleCallba ...

  10. hdu 1098 Lowest Bit 解题报告

    题目链接:http://code.hdu.edu.cn/game/entry/problem/show.php?chapterid=1&sectionid=2&problemid=22 ...