[51Nod1487]占领资源
题目大意:
有一个$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]占领资源的更多相关文章
- GridView控件
GridView是ASP.NET 1.x的DataGrid控件的后继者.它提供了同样的基本功能集,同一时候添加�了大量扩展和改进.如前所述,DataGrid(ASP.NET 2.0仍然全然支持)是一个 ...
- 多线程相互排斥--mutex(二)
不知道大家对多线程或多进程间的同步相互排斥的控制机制了解的怎么样,事实上有非常多种方法能够实现这个目的,可是这些方法事实上由4种最主要的方法实现.这4种最主要的方法详细定义例如以下:在这有讲得不正确的 ...
- Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]
1523 非回文 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个字符串是非回文的,当且仅当,他只由前p个小写字母 ...
- 胡小兔的OI日志3 完结版
胡小兔的 OI 日志 3 (2017.9.1 ~ 2017.10.11) 标签: 日记 查看最新 2017-09-02 51nod 1378 夹克老爷的愤怒 | 树形DP 夹克老爷逢三抽一之后,由于采 ...
- Q语言-[帝王三国送将辅助]
纯属自己写的, 玩同一个游戏的朋友,需要送将的, 把需要送的将改名为送, 然后启动辅助即可 本辅助只支持1024x576 191dpi 附上源码 //本源码初始化分辨率1024x576[夏天] Dim ...
- #51nod上topcoder练习记
好久没刷51nod了,又听说topcoder有很多好题.那么就来51nod上刷吧.(那个客户端搞得有点烦(看不懂)) [1366 贫富差距] 当图不连通的时候,答案为无穷大. 当图连通时,两个点之间的 ...
- 【一起学OpenFOAM】04 OpenFOAM的学习资源
OpenFOAM的学习资料并不多,个人猜测也许是与软件的类型有关系. 对于商用软件来讲,由于要占领市场,软件开发商自然是巴不得会用软件的人越多越好,因为他们卖的是软件,会用的人越多,软件卖得越好.他们 ...
- Fis3的前端工程化之路[三大特性篇之资源定位]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
随机推荐
- 浅谈传输层协议TCP和UDP
在当今因特网的层次结构中,传输层的协议主要有两种,其一为Transmission Control Protocol,即TCP:其二为User Datagram Protocol,即UDP. 1.TCP ...
- Python下安装protobuf
1. 下载安装包 2. 解压缩 tar –xzvf protobuf-2.6.1.tar.gz 3. 安装protoc 在python中使用protocbuf需要Protocal Buffer 编译器 ...
- Android详细目录结构
Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等 ...
- v-if与v-show区别
在v-show中,元素是一直存在的,当v-show为false时,元素display:none只是隐藏了而已. v-if 作用:判断是否加载固定的内容,如果为真,则加载:为假时,则不加载. 用处:用在 ...
- 火焰图还有perf
http://www.brendangregg.com/flamegraphs.html zhangyichun大神的systemtap脚本: https://github.com/openresty ...
- BZOJ2208 [Jsoi2010]连通数 【图的遍历】
题目 输入格式 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. 输出格式 输出一行一个整数,表示该图的连通数. 输入样例 3 ...
- 输出读入优化——QAQ
#include<bits/stdc++.h> const int RN=1e5; ],*ip=ib+RN,ob[RN+],*op=ob; inline int gc(){ ip==ib+ ...
- noip 2010 三国游戏
三国游戏 三国游戏 描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有N 位武将(N为偶数且不小于4),任 ...
- JS与jQuery中html-与-text方法的区别
所有的实例均用下面的html <div id="id0"> <div id="id1"> 直接text <p> <sp ...
- python xpath 基本用法
转自:http://www.pythoner.cn/home/blog/python-xpath-basic-usage/ Pyer发现 业界资讯 相册 第7期:Pythoner技术交流沙龙 关于我们 ...