• [1618] 投放炸弹

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • 我们定义一个炸弹能炸毁的地方要求曼哈顿距离小于等于某个值。
    曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。-来自百度百科
    现在给出一个n*m的平面图,'.'表示无人区,'*'表示居民区。炸弹只能投放在无人区,炸弹能炸毁曼哈顿距离小于等于x的所有居民区,现在你要来投放这个炸弹,请输出炸弹最多能炸毁的居民区个数。
  • 输入
  • 多组输入,每组第一行n,m,x。
    接下来输入n行,每行m个字符,字符只有'.'和'*'。
    数据范围:1<=n,m<=200,1<=x<=1e9
  • 输出
  • 每组输出一行,最多可以炸毁的居民区个数。
  • 样例输入
  • 4 5 1
    ..*..
    **.**
    ..*..
    .....
    2 3 4
    ***
    ***
  • 样例输出
  • 4
    0

题目链接:NBUT 1618

大一那会儿留下来的题目,最近想学KDtree突然想起来这题……很那啥的一道题,佩服作者的YY能力,实际上题目中炸弹范围是一个菱形,如果忽略地图边界,还是一个完全对称的菱形,DFS的话T了很多发,这题如果仔细想想是可以用二维树状数组做的,T[i][j]维护第i行前j个格子中含有居民点的前缀和,菱形内的居民区个数可以从上到下一行一行地求出来,当然这题有个小坑就是范围可以很大,那么根据题目实际地图大小缩小到实际可以使用的范围就好了。求和的时候个别边界出现负数处理一下即可

代码:

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <sstream>
#include <numeric>
#include <cstring>
#include <bitset>
#include <string>
#include <deque>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 210;
int T[N][N];
char s[N][N];
int n, m; void init()
{
CLR(T, 0);
}
void add(int h, int k, int v)
{
while (k < N)
{
T[h][k] += v;
k += (k & -k);
}
}
int getsum(int h, int k)
{
if (k <= 0)
return 0;
int ret = 0;
if (k > m)
k = m;
while (k)
{
ret += T[h][k];
k -= (k & -k);
}
return ret;
}
int main(void)
{
int k, i, j;
while (~scanf("%d%d%d", &n, &m, &k))
{
init();
for (i = 1; i <= n; ++i)
{
scanf("%s", s[i] + 1);
for (j = 1; j <= m; ++j)
{
if (s[i][j] == '*')
add(i, j, 1);
}
}
int ans = 0;
k = min(k, max(n, m));
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= m; ++j)
{
if (s[i][j] == '.')
{
int temp = getsum(i, j + k) - getsum(i, j - k - 1);
for (int kk = 1; kk <= k; ++kk)
{
int up = i - kk, down = i + kk;
if (up >= 1)
temp += getsum(up, j + k - kk) - getsum(up, j - k - 1 + kk);
if (down <= n)
temp += getsum(down, j + k - kk) - getsum(down, j - k - 1 + kk);
}
if (temp > ans)
ans = temp;
}
}
}
printf("%d\n", ans);
}
return 0;
}

NBUT 1618 投放炸弹(树状数组)的更多相关文章

  1. TOJ 4105 Lines Counting(离线树状数组)

    4105.   Lines Counting Time Limit: 2.0 Seconds   Memory Limit: 150000K Total Runs: 152   Accepted Ru ...

  2. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  3. bzoj1878--离线+树状数组

    这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...

  4. codeforces 597C C. Subsequences(dp+树状数组)

    题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...

  5. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  6. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  7. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  8. 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组

    E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  9. 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Sta ...

随机推荐

  1. Linux 的歷史

    Unix 狹義作業系統提供應用程式及命令直譯器. 作業系統發展初期並不具可攜性. Bell, GE 及 MIT 合作開發的 "Multice" 系統( 相容分時系統 ). 1969 ...

  2. Activiti学习记录(二)

    1.初始化数据库 使用工作流引擎创建23张表 public class TestActiviti { /** * 使用代码创建工作流需要的23张表 */ @Test public void creat ...

  3. java基础面试题:try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

    package com.swift; public class Try_Catch_Finally_Test { public static void main(String[] args) { /* ...

  4. iOS 多线程(NSThread、GCD、NSOperation)

    ios中得多线程技术主要使用3种:NSThread.NSOperation和GCD 一.NSThread: 最轻量级方法,但是不安全需要手动加锁,需要自己管理生命周期 NSThread的使用方法有2种 ...

  5. 51nod——1285 山峰和分段(暴力出奇迹)

    要求每段的点数都一样,因此分的段数cnt肯定是n的因子,要求每段都有山峰,因此cnt肯定小于等于山峰数量.分段的宽度d=n/cnt,对山峰数量做一个前缀和,检查一下每一段的山峰数量是否没有增加即可. ...

  6. BZOJ2287: 【POJ Challenge】消失之物(背包dp)

    题意 ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢?” ...

  7. 成员变量(实例变量)&局部变量&静态变量(类变量)的区别

    成员变量(实例变量)&局部变量区别: (1)作用域 成员变量:针对整个类有效. 局部变量:只在某个范围内有效.(一般指的就是方法,语句体内) (2)存储位置 成员变量:随着对象的创建而存在,随 ...

  8. ATM-core-src

    from interface import bank, shopping, userfrom lib import common user_data = { 'name': None} def log ...

  9. PHP 批量操作 Excel

    自己封装了一个批量操作excel文件的方法,通过xls文件地址集合遍历,第三个参数传入一个匿名函数用于每个需求的不同进行的操作,实例中我想要得到列表中含有折字的行,封装成sql语句返回. xls文件超 ...

  10. 查询集 QuerySet和管理器Manager

    查询集 QuerySet 查询集,也称查询结果集.QuerySet,表示从数据库中获取的对象集合. 当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表): all():返回所有数据. ...