HDU мульти-школа шестой +1006 Далекий - математика деление пространства +

Тема ссылки: точка I ах ╭ (╯ ^ ╰) ╮

С учетом эффекта:

    Есть два аспекта N N точки, удовлетворены, и
     ( | Икс я - Икс е | + | и я - и е | ) (| X_i-x_e | + | y_i-y_e |) м d модификация К я знак равно T я K_i = t_i
    умолять ( Икс е , и е ) (X_e, y_e) Кол

Проблемно-разрешающие идеи:Here Вставка рисунка Описание

    Перечислите N 2 п ^ 2 Shi регионы
    для каждого региона, только перечисление 60 * 60 60 * 60 размер может
    затем вычислить количество точекпределах области законного

Core: перечисление область, математическое мышление

#include<bits/stdc++.h>
#define rint register int
#define deb(x) cerr<<#x<<" = "<<(x)<<'\n';
using namespace std;
typedef long long ll;
int T, n, m, tx[15], ty[15];
struct node{
	int x, y, k, t;
} a[15];

bool check(int x, int y){
	for(int i=1; i<=n; i++)
		if((abs(a[i].x-x) + abs(a[i].y-y)) % a[i].k != a[i].t)
			return false;
	return true;
}

ll cal(int l, int r){
	ll cnt = r - l - 1;
	if(cnt < 0) return 0;
	return cnt / 60 + 1;
}

int main() {
	scanf("%d", &T);
	while(T--){
		scanf("%d%d", &n, &m);
		for(int i=1; i<=n; i++){
			scanf("%d%d%d%d", &a[i].x, &a[i].y, &a[i].k, &a[i].t);
			tx[i] = a[i].x, ty[i] = a[i].y;
		}
		tx[n+1] = ty[n+1] = m + 1;
		sort(tx+1, tx+2+n);
		sort(ty+1, ty+2+n);
		int cnt1 = unique(tx+1, tx+2+n) - tx - 1;
		int cnt2 = unique(ty+1, ty+2+n) - ty - 1;
		
		ll ans = 0;
		for(int nx=0; nx<cnt1; nx++)
			for(int ny=0; ny<cnt2; ny++)
				for(int i=0; i<60; i++)
					for(int j=0; j<60; j++)
						if(check(tx[nx]+i, ty[ny]+j))
							ans += cal(tx[nx]+i, tx[nx+1]) * cal(ty[ny]+j, ty[ny+1]);
		printf("%lld\n", ans);
	}
}
Опубликовано 221 оригинальные статьи · вона похвала 220 · просмотров 20000 +

рекомендация

отblog.csdn.net/Scar_Halo/article/details/103037194
рекомендация