1. 程式人生 > >【題解】洛谷P2038[NOIP2014]無線網路發射器選址 樹狀陣列

【題解】洛谷P2038[NOIP2014]無線網路發射器選址 樹狀陣列

題目連結

題目描述

隨著智慧手機的日益普及,人們對無線網的需求日益增大。某城市決定對城市內的公共場所覆蓋無線網。

假設該城市的佈局為由嚴格平行的 129129 條東西向街道和 129129 條南北向街道所形成的網格狀,並且相鄰的平行街道之間的距離都是恆定值 11。東西向街道從北到南依次編號為 0,1,212800,1,2 \dots 1280,南北向街道從西到東依次編號為 0,1,21280,1,2 \dots 128

東西向街道和南北向街道相交形成路口,規定編號為 xx 的南北向街道和編號為 yy 的東西向街道形成的路口的座標是 (x,y)(x, y)

。在某些路口存在一定數量的公共場所。

由於政府財政問題,只能安裝一個大型無線網路發射器。該無線網路發射器的傳播範圍是一個以該點為中心,邊長為 2d2d 的正方形。傳播範圍包括正方形邊界。

現在政府有關部門準備安裝一個傳播引數為 dd 的無線網路發射器,希望你幫助他們在城市內找出合適的路口作為安裝地點,使得覆蓋的公共場所最多。

輸入輸出格式

輸入格式:

第一行包含一個整數 dd,表示無線網路發射器的傳播距離。

第二行包含一個整數 nn,表示有公共場所的路口數目。

接下來 nn 行,每行給出三個整數 x,y,kx, y, k,中間用一個空格隔開,分別代表路口的座標 (x,y)

(x, y) 以及該路口公共場所的數量。同一座標只會給出一次。

輸出格式: 輸出一行,包含兩個整數,用一個空格隔開,分別表示能覆蓋最多公共場所的安裝地點方案數,以及能覆蓋的最多公共場所的數量。

輸入輸出樣例

輸入樣例#1:

1 2 4 4 10 6 6 20

輸出樣例#1:

1 30

說明

對於100%100\%的資料,1d20,0x128,0<k10000001 \leq d \leq 20, 0 \leq x \leq 128,0 < k \leq 1000000.

被普及-矇蔽了雙眼,覺得只要暴力就好,結果我暴力老是錯……

#include<cstdio>
#include<algorithm>
using namespace std;
int c[1010][1010],n,d,maxn,cnt;
void add(int x,int y,int k)
{
	for(int i=x;i<=129+d;i+=i&(-i))
	for(int j=y;j<=129+d;j+=j&(-j))
	c[i][j]+=k;
}
int query(int x,int y)
{
	int ret=0;
	for(int i=x;i;i-=i&(-i))
	for(int j=y;j;j-=j&(-j))
	ret+=c[i][j];
	return ret;
}
int main()
{
	//freopen("in.txt","r",stdin);
    scanf("%d%d",&d,&n);int x,y,k;
    for(int i=1;i<=n;i++)
    {
    	scanf("%d%d%d",&x,&y,&k);x++;y++;
    	add(x,y,k);
	}
	for(int i=d+1;i<=129+d;i++)
	for(int j=d+1;j<=129+d;j++)
	{
		x=max(0,i-2*d-1),y=max(0,j-2*d-1);
		int ans=query(i,j)-query(x,j)-query(i,y)+query(x,y);
		if(maxn<ans)maxn=ans,cnt=1;
		else if(maxn==ans)cnt++;
	}
	printf("%d %d\n",cnt,maxn);
	return 0;
}

總結

我太菜了