题目大意:
​  有一个$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全栈工程师(迭代器、字节串)

    ParisGabriel                每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰     Python人工智能从入门到精通 迭代器 Iterator: 用<&g ...

  2. [转]LVS+Keepalived负载均衡配置

    简介 来源:https://www.cnblogs.com/MacoLee/p/5858995.html lvs一般是和keepalived一起组合使用的,虽然也可以单独使用lvs,但配置比较繁琐,且 ...

  3. Qt Creator : Read an image from resources

    最近两周碰到的一个问题是: opencv无法读取qt中的资源文件. 参考网址:https://stackoverflow.com/questions/45233559/qt-creator-read- ...

  4. table内容超出宽度时隐藏并显示省略标记

    HTML中,一个表格,要达到二个条件: 1.内容多了不自动换行: 2.固定单元格宽度.如果内容超出,则隐藏: 如 果在IE下,只是写成<table style="table-layou ...

  5. Linux网卡驱动程序对ethtool的支持和实现

    Linux 的一个显著特点就是其强大的网络功能,Linux 几乎支持所有的网络协议,并在这些协议基础上提供了丰富的应用.对 Linux 网络管理的重要性不言而喻,这些管理依赖于网络工具,比如最常用的 ...

  6. [译]如何去除pandas dataframe里面的Unnamed的列?

    原文来源: https://stackoverflow.com/questions/43983622/remove-unnamed-columns-in-pandas-dataframe 问:我有一个 ...

  7. POJ A-Wireless Network

    http://poj.org/problem?id=2236 An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated ...

  8. 软考——(1)J2SE

    我们先从Java说起,简单的说,Java是一种面向对象的程序设计语言,可跨平台使用. 与之前学习的程序设计语言相比,最值得一提的就是Java的两种核心机制:Java虚拟机和垃圾回收机制. 1)虚拟机 ...

  9. 第十五篇:jQuery

    本篇内容 简介 使用 一. 简介 jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. jQuery 很容易学习. jQuery 库可以通过一行简 ...

  10. Redis客户端命令

    Redis客户端命令 Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. ...