2020ICPC · Première soustraction J-Matrix du tournoi Xiaomi Internet Trial (Différentiel + Array)

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;
}

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43871207/article/details/109278038
conseillé
Classement