题目大意:
​  有一个$n\times m(x,m\leq 100)$的网格图,每个格子有一个权值$w_{i,j}(1\leq w_{i,j}\leq 9)$。你可以在图中选两个格子,每个格子$(x,y)$可以接收$k(k\leq 10)$个格子,$(x+dx[1],y+dy[1]),(x+dx[2],y+dy[2]),\ldots,(x+dx[k],y+dy[k])$的权值。超出边界的能量不接收,每个格子的权值最多被接收一次,问最多能接收多少权值。

思路:
​  考虑选择不同格子,吸收权值的范围不相交的情况,我们可以直接暴力$O(nmk)$求出每个点能吸收的权值,然后选两个最大的加起来即可。
​  现在每个格子的吸收范围可能会相交,因此我们还需要分两种情况考虑。
  我们可以先求出每个点能吸收的权值,然后找出吸收范围会和该点重合的点,不难发现这样的点最多只有$k^2$个。
  对于会相交的点,我们暴力求一下可以吸收哪些点的权值,对于不相交的点,可以直接用稀疏表求区间最大值,时间复杂度$O(nmk^2\log(nm))$。

 #include<set>
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) if(ch=='-') neg=true;
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return neg?-x:x;
}
inline int getblock() {
register char ch;
while(!isdigit(ch=getchar()));
return ch^'';
}
typedef std::pair<int,int> Point;
const int N=,K=,logN2=;
std::set<Point> set;
bool vis[N*N],b[N][N];
int n,m,k,a[N][N],dx[K],dy[K],max[N*N][logN2],q[K*K+];
inline bool check(const int &x,const int &y) {
return x>=&&x<n&&y>=&&y<m;
}
inline int id(const int &x,const int &y) {
return x*m+y;
}
inline int log2(const float &x) {
return ((unsigned&)x>>&)-;
}
inline int query(const int &l,const int &r) {
const int k=log2(r-l+);
return std::max(max[l][k],max[r-(<<k)+][k]);
}
inline int calc(const int &x1,const int &y1) {
int ret=q[]=;
for(register int i=;i<k;i++) {
const int x3=x1+dx[i],y3=y1+dy[i];
if(!check(x3,y3)) continue;
b[x3][y3]=true;
for(register int j=;j<k;j++) {
const int x2=x3-dx[j],y2=y3-dy[j];
if(!check(x2,y2)||vis[id(x2,y2)]) continue;
vis[q[++q[]]=id(x2,y2)]=true;
}
}
for(register int i=;i<=q[];i++) {
vis[q[i]]=false;
}
q[++q[]]=-;
q[++q[]]=n*m;
std::sort(&q[],&q[q[]+]);
for(register int i=;i<q[];i++) {
if(q[i]+<=q[i+]-) {
ret=std::max(ret,query(q[i]+,q[i+]-));
}
}
for(register int i=;i<q[];i++) {
const int x2=q[i]/m,y2=q[i]%m;
int tmp=;
for(register int i=;i<k;i++) {
const int x3=x2+dx[i],y3=y2+dy[i];
if(!check(x3,y3)||b[x3][y3]) continue;
tmp+=a[x3][y3];
}
ret=std::max(ret,tmp);
}
for(register int i=;i<k;i++) {
const int x3=x1+dx[i],y3=y1+dy[i];
if(!check(x3,y3)) continue;
b[x3][y3]=false;
}
return ret;
}
int main() {
for(register int T=getint();T;T--) {
n=getint(),m=getint(),k=getint();
for(register int i=;i<n;i++) {
for(register int j=;j<m;j++) {
a[i][j]=getblock();
}
}
for(register int i=;i<k;i++) {
dx[i]=getint(),dy[i]=getint();
if(set.count((Point){dx[i],dy[i]})) {
i--,k--;
} else {
set.insert((Point){dx[i],dy[i]});
}
}
set.clear();
for(register int x=;x<n;x++) {
for(register int y=;y<m;y++) {
for(register int i=max[id(x,y)][]=;i<k;i++) {
if(!check(x+dx[i],y+dy[i])) continue;
max[id(x,y)][]+=a[x+dx[i]][y+dy[i]];
}
}
}
for(register int j=;j<=log2(n*m);j++) {
for(register int i=;j<=log2(n*m-i);i++) {
max[i][j]=std::max(max[i][j-],max[i+(<<(j-))][j-]);
}
}
int ans=;
for(register int x1=;x1<n;x1++) {
for(register int y1=;y1<m;y1++) {
ans=std::max(ans,max[id(x1,y1)][]+calc(x1,y1));
}
}
printf("%d\n",ans);
}
return ;
}

[51Nod1487]占领资源的更多相关文章

  1. GridView控件

    GridView是ASP.NET 1.x的DataGrid控件的后继者.它提供了同样的基本功能集,同一时候添加�了大量扩展和改进.如前所述,DataGrid(ASP.NET 2.0仍然全然支持)是一个 ...

  2. 多线程相互排斥--mutex(二)

    不知道大家对多线程或多进程间的同步相互排斥的控制机制了解的怎么样,事实上有非常多种方法能够实现这个目的,可是这些方法事实上由4种最主要的方法实现.这4种最主要的方法详细定义例如以下:在这有讲得不正确的 ...

  3. Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]

    1523 非回文 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个字符串是非回文的,当且仅当,他只由前p个小写字母 ...

  4. 胡小兔的OI日志3 完结版

    胡小兔的 OI 日志 3 (2017.9.1 ~ 2017.10.11) 标签: 日记 查看最新 2017-09-02 51nod 1378 夹克老爷的愤怒 | 树形DP 夹克老爷逢三抽一之后,由于采 ...

  5. Q语言-[帝王三国送将辅助]

    纯属自己写的, 玩同一个游戏的朋友,需要送将的, 把需要送的将改名为送, 然后启动辅助即可 本辅助只支持1024x576 191dpi 附上源码 //本源码初始化分辨率1024x576[夏天] Dim ...

  6. #51nod上topcoder练习记

    好久没刷51nod了,又听说topcoder有很多好题.那么就来51nod上刷吧.(那个客户端搞得有点烦(看不懂)) [1366 贫富差距] 当图不连通的时候,答案为无穷大. 当图连通时,两个点之间的 ...

  7. 【一起学OpenFOAM】04 OpenFOAM的学习资源

    OpenFOAM的学习资料并不多,个人猜测也许是与软件的类型有关系. 对于商用软件来讲,由于要占领市场,软件开发商自然是巴不得会用软件的人越多越好,因为他们卖的是软件,会用的人越多,软件卖得越好.他们 ...

  8. Fis3的前端工程化之路[三大特性篇之资源定位]

    Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...

  9. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

随机推荐

  1. leetcode 201. 数字范围按位与 解题报告

    给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点). 示例 1: 输入: [5,7] 输出: 4 ...

  2. 第九章 广播和本地组播(IGMP和MLD)

    距离项目开启已经过去了一段时间,这段时间内自己学习的内容也算挺多的,但是也较容易遗忘,之后应该在空余的时间内多翻翻博客,更加清楚传统计算机网络的运作. 由于51要出去玩,更要好好利用好最近的时间.完成 ...

  3. 【python】用python爬取中科院院士简介信息

    018/07/09 23:43 项目名称:爬取中科院871个院士的简介信息 1.爬取目的:中科院871个院士的简介信息 2.爬取最终结果: 3.具体代码如下: import re # 不用安装(注意! ...

  4. group_load,weight_load,group_capacity, group_weight大致都是啥数值

    [ 113.180820] sgs->group_load:2039,sum_nr_running:2,sum_weighted_load:2039,sgs->group_capacity ...

  5. glibc内存泄露以及TCmalloc 简单分析

    最近开发一个私人程序时碰到了严重的内存问题,具体表现为:进程占用的内存会随着访问高峰不断上升,直到发生OOM被kill为止.我们使用valgrind等工具进行检查发现程序并无内存泄露,经过仔细调查我们 ...

  6. 深入解析VueJs中的V-bind指令

    v-bind 主要用于属性绑定,比方你的class属性,style属性,value属性,href属性等等,只要是属性,就可以用v-bind指令进行绑定.这次主要介绍了VueJs中的V-bind指令,需 ...

  7. Printed Circuit Board (board)

    Printed Circuit Board (board) 题目描述 给出一个N个顶点的简单多边形,对于每个顶点,假如它和原点连成的线段只在这个顶点处和多边形相交,就称为满足要求的顶点.你的任务是输出 ...

  8. 如何用cookie保存用户的登录的密码和用户名

    思路:绘制一个简单的登录界面的Servlet并要在此页面中读取保存密码和用户名的cookie--->在登录处理界面的servlet中把用户名和密码保存到cookie中 //登录界面的Servle ...

  9. bzoj 4897 天赋 有向图的矩阵数定理

    4894: 天赋 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 104  Solved: 80[Submit][Status][Discuss] De ...

  10. transition transform animate的使用

    注:代码显示效果可以自行粘贴复制查看 transition(过渡),主要是关注property的变化主要有四个属性transition-property.transition-durantion.tr ...