Lien: https://ac.nowcoder.com/acm/contest/7501/J
Source: Niuke
Limite de temps: C / C ++ 1 seconde, autres langues 2 secondes
Limite d'espace: C / C ++ 262144K, autres langues 524288K
64 bits IO Format:% lld
Description du titre
Étant donné une matrice MM _ {} M de taille n × mn \ fois mn × m et deux entiers a, ba, b _ {} a, b, déterminez s'il est possible de rendre toutes les entrées de MM _ {} M nulles par en choisissant à plusieurs reprises a × ba \ fois ba × b sous-matrices et réduisez les valeurs des matrices choisies de 1. Si possible, imprimez "^ _ ^" sur une ligne, ou imprimez "QAQ" sur une ligne.
Entrez la description:
La première ligne contient un entier T (1≤T≤100), indiquant le nombre de cas de test. Pour chaque cas de test: La première ligne contient quatre entiers n, m, a, b (1≤n, m≤1000,1≤a≤n, 1≤b≤m) n, m, a, b ~ (1 \ le n, m \ le 1000, 1 \ le a \ le n, 1 \ le b \ le m) n, m, a, b (1≤n, m≤1000,1≤a≤n, 1≤b≤ m), désignant respectivement la taille de la matrice donnée et la taille des sous-matrices choisies. Les nn _ {} n lignes suivantes contiennent chacune mm _ {} m entiers Mi, j (0≤Mi, j≤109) M_ {i, j} ~ (0 \ le M_ {i, j} \ le 10 ^ 9 ) Mi, j (0≤Mi, j ≤109), désignant les entrées de la matrice MM _ {} M. Il est garanti que ∑nm≤106 \ sum nm \ le 10 ^ 6∑nm≤106.
Description de la sortie:
Imprimer TT _ {} T lignes contenant chacune une chaîne "^ _ ^" ou "QAQ", indiquant la réponse à chaque cas de test.
Exemple 1
Entrer
2 2 2 1 2 1 2 1 2 2 3 1 2 1 2 1 1 2 1
Production
QAQ ^ _ ^
Description
Pour le second cas, un schéma possible est de choisir (1,1) - (1,2), (1,2) - (1,3), (2,1) - (2,2), (2, 2) - (2,3) respectivement.
Titre:
Il y a une matrice, chaque fois que vous pouvez sélectionner une sous-matrice de taille a * b, soustraire chaque nombre de la sous-matrice de 1, et demander si la matrice d'origine peut être réduite à 0 après plusieurs opérations
Commencez à soustraire à partir du coin supérieur gauche, en utilisant la modification d'intervalle et la requête en un seul point du tableau d'arborescence.
(Pourquoi il n'y a pas de courant alternatif cet après-midi: le tableau est agrandi et le délai d'attente du memset
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e3 + 20;
ll mp[N][N];
ll aa[N][N];
ll n, m, a, b, nn;
ll lowbit(ll k) {
return k & (-k);
}
void add(ll x, ll y, ll v) {
while(x <= nn) { ///nn需要修改
ll ty = y;
while(ty <= nn) ///nn需要修改
mp[x][ty] += v, ty += lowbit(ty);
x += lowbit(x);
}
}
void real_add(ll x1, ll y1, ll x2, ll y2, ll v) {
add(x1, y1, v);
add(x1, y2 + 1, -v);
add(x2 + 1, y1, -v);
add(x2 + 1, y2 + 1, v);
}
ll sum(ll x, ll y) {
ll res = 0;
while(x) {
ll ty = y;
while(ty)
res += mp[x][ty], ty -= lowbit(ty);
x -= lowbit(x);
}
return res;
}
int main() {
ll t;
scanf("%lld", &t);
while(t--) {
scanf("%lld%lld%lld%lld", &n, &m, &a, &b);
memset(mp, 0, sizeof(mp));
nn = max(n, m);
for(ll i = 1; i <= n; i++) {
for(ll j = 1; j <= m; j++) {
scanf("%lld", &aa[i][j]);
add(i, j, aa[i][j] - aa[i][j - 1] - aa[i - 1][j] + aa[i - 1][j - 1]);
}
}
bool flag = 1;
for(ll k = 2; k <= n + m; ++k) {
for(ll i = 1; i < k; ++i) {
ll x1 = i, y1 = k - i;
ll x2 = x1 + a - 1, y2 = y1 + b - 1;
if(x1 < 1 || x1 > n || y1 < 1 || y1 > m) continue;
if(x2 < 1 || x2 > n || y2 < 1 || y2 > m) continue;
ll tmp = sum(x1, y1);
if(tmp < 0) {
flag = 0;
break;
}
else if(tmp > 0) real_add(x1, y1, x2, y2, -tmp);
}
if(!flag) break;
}
if(flag) {
for(ll i = 1; i <= n; ++i) {
for(ll j = 1; j <= m; ++j) {
if(sum(i, j) != 0) {
flag = 0;
break;
}
}
if(!flag) break;
}
}
if(flag) printf("^_^\n");
else printf("QAQ\n");
}
return 0;
}