列表

详情


NC202507. 牛客泡泡堂

描述

游戏规则如下,一个n*n的地图上,有许多玩家,他们的位置信息存在Player数组中,牛妹可以选择一个位置放下一个炸弹,这个炸弹会以“十”字形状展开,假设牛妹的攻击力是m,他在(x,y)处丢下炸弹,那么牛妹可以炸死以及位置的人,牛妹想知道她放一个炸弹最多能炸死多少人?

输入描述

给定,,数组,Player.x表示横坐标位置,Player.y表示纵坐标位置
  

示例1

输入:

2,2,[(1,1),(1,2)]

输出:

2

说明:

在(1,1)处放炸弹能杀死两个玩家

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Go(1.14.4) 解法, 执行用时: 444ms, 内存消耗: 41156K, 提交时间: 2020-07-30 23:27:58

package main

import . "nc_tools"

// github.com/EndlessCheng/codeforces-go
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

type seg []struct{ l, r, max int }

func (t seg) build(o, l, r int) {
	t[o].l, t[o].r = l, r
	if l == r {
		return
	}
	m := (l + r) >> 1
	t.build(o<<1, l, m)
	t.build(o<<1|1, m+1, r)
}

func (t seg) update(o, i, v int) {
	if t[o].l == t[o].r {
		t[o].max += v
		return
	}
	if i <= (t[o].l+t[o].r)>>1 {
		t.update(o<<1, i, v)
	} else {
		t.update(o<<1|1, i, v)
	}
	t[o].max = max(t[o<<1].max, t[o<<1|1].max)
}

func BoomKill(n, m int, players []*Point) (ans int) {
	m--
	gx := [2e5 + 1][]int{}
	for _, p := range players {
		gx[p.X] = append(gx[p.X], p.Y)
	}
	t := make(seg, 4*n)
	t.build(1, 1, n)
	for i := 1; i <= m; i++ {
		for _, y := range gx[i] {
			t.update(1, y, 1)
		}
	}
	for i := 1; i <= n; i++ {
		if i-m-1 > 0 {
			for _, y := range gx[i-m-1] {
				t.update(1, y, -1)
			}
		}
		if i+m <= n {
			for _, y := range gx[i+m] {
				t.update(1, y, 1)
			}
		}
		for _, y := range gx[i] {
			t.update(1, y, -1)
		}
		ans = max(ans, len(gx[i])+t[1].max)
		for _, y := range gx[i] {
			t.update(1, y, 1)
		}
	}
	return
}

C++11(clang++ 3.9) 解法, 执行用时: 209ms, 内存消耗: 21020K, 提交时间: 2020-08-09 11:17:32

class Solution
{
	public:
		const static int N=2e5+7;
		int bit=1;
		int mx[N<<2];
		vector<int> ve[N];
		inline void Insert(int k,int val)
		{
			for(auto y:ve[k])
			{
				int p=y+bit;
				mx[p]+=val;
				for(p>>=1;p;p>>=1)
				mx[p]=max(mx[p<<1],mx[p<<1|1]);
			}
		}
		int BoomKill(int n,int m,vector<Point> &p)
		{
			for(;bit<=n+1;bit<<=1);
			int ans=0;
			for(int i=0;i<p.size();++i)
			ve[p[i].x].push_back(p[i].y);
			for(int i=1;i<m;++i)
			Insert(i,1);
			for(int i=1;i<=n;++i)
			{
				if(i+m-1<=n)
				Insert(i+m-1,1);
				if(i-m>0)
				Insert(i-m,-1);
				Insert(i,-1);
				ans=max(ans,mx[1]+(int)ve[i].size());
				Insert(i,1);
			}
			return ans;
		}
};

上一题