题目大意:
​  有一个$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. python之上下文管理、redis的发布订阅、rabbitmq

    使用with打开文件的方式,是调用了上下文管理的功能 #打开文件的两种方法: f = open('a.txt','r') with open('a.txt','r') as f 实现使用with关闭s ...

  2. Tensorflow实现LSTM识别MINIST

    import tensorflow as tf import numpy as np from tensorflow.contrib import rnn from tensorflow.exampl ...

  3. 蓝桥杯_风险度量_dfs_无向图两节点间的所有路径

    标题:风险度量 X星系的的防卫体系包含 n 个空间站.这 n 个空间站间有 m 条通信链路,构成通信网.两个空间站间可能直接通信,也可能通过其它空间站中转. 对于两个站点x和y (x != y), 如 ...

  4. 软工实践 - 第十三次作业 Alpha 冲刺 (4/10)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/9980005.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去 ...

  5. C++中include<> 与 include" " 的区别

    <>时先去系统目录中找头文件,如果没有再到当前目录下找.所以像标准的头文件 stdio.h, stdlib.h等都用<>; ""则首先到当前目录下找,如果找 ...

  6. IE8专用hack

    众所周知,ie6.7的hack直接用*即可,但是ie8的话就比较麻烦,在做半透明背景的时候,为了兼容ie6.7,可以为其设置纯色,但是ie8也同样不支持半透明,需要单独为它设置纯色背景.下面的兼容代码 ...

  7. BZOJ2716 [Violet 3]天使玩偶 【CDQ分治】

    题目 输入格式 输出格式 输入样例 //样例太长就不贴了.... 输出样例 //见原题 提示 题解 我们将曼哈顿距离式子中的绝对值去掉,每次只考虑x,y比当前点小的更新答案. 为了使所有点都对答案进行 ...

  8. Tomcat给我的java.lang.OutOfMemoryError: PermGen

    今天,Tomcat给了我这么一个异常:java.lang.OutOfMemoryError: PermGen space.自己是第一次遇到,抱着好奇的心情google了一下,居然是个很常见的异常!故记 ...

  9. Linux wget 安装JDK失败

    windows 下安装的话,查看网络,就会发现,是带cookie,回调参数Authparam 验证的

  10. HDU1892 See you~

    Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission( ...