Reverse Anzahl der Spalten [HAOI2009]

[Titel Beschreibung
für eine Reihe von Spalten \ (A \) , wenn es \ (i <j \) und \ (a_i> a_j \) , dann sagen wir \ (a_i \) und \ (a_j \) als ein Paar von umgekehrter Reihenfolge Nummer. Für wenn ein von (1 \ sim n \) \ Reihe bestehend aus natürlichen Zahlen, es ist einfach , die Anzahl der Rückwärts zu zählen , hat , erhalten. Dann wird die Rückseite der Zahl \ (k \) am Ende , wie viele solche natürlichen Zahlen der Anzahl der Spalten?

[Eingabeformat
der ersten beiden Handlungen von ganzen Zahlen \ (n-, K \) .

[Ausgabeformat]
eine ganze Zahl , die die Anzahl der Qualifikation Serie schreiben , da diese Zahl groß sein kann, die Anzahl der zur Ausgabe nur noch \ (\ 10000) Ergebnisse nach den Rest suchen.

Problemlösung

Emergent es. . . Einfache Push DP Gleichung

\ (Dp [i] [j ] \) darstellt \ (1 \ sim i \) eine umgekehrte Anordnung zu der vollen Anzahl \ (J \) ist die Anzahl der

Rand: \ ([. 1]. DP [2] [0] = DP [2] = 1 \) besondere Aufmerksamkeit \ (dp [1] [0 ] = 1 \)

Hier ist die Transportgleichung

Für Kastanien es: \ (3,1,2 \) Nun ist die \ (4 \) in die Liste aufgenommen , wenn die Erhöhung der \ (K \) hinter der Zahl \ ((0 \ le k \ le 3) \) umgekehrte Reihenfolge es wird mehr sein \ (3-k \) th

Dann ist es ist \ (dp [i] [j ] = \ sum \ limits_ {k = 0} ^ {i-1} dp [i-1] [jk] \)

Wie auf Push \ (DP [4] [3] \) es \ (4 \) in einem ersten Array und die Anzahl der Rückwärts \ (3 \) Anzahl Schema \ (dp [3] [0 ] \ ) , weil Sie \ (4 \) stellen die erste wird mehr als generieren \ (3 \) Umkehrungen der Sache , dass die ursprüngliche \ (3 \) Zahl nur umgekehrt kann nicht richtig ist

Präfix und \ (O (1) \) Übertragungs

\ (Dp \) Array - Dimension zuerst entfernt werden kann und dann die Offline - Daten tun, obwohl dies auch nichts anderes als Wasser bekommt nicht von einem Jahr ACM rid / ICPC scheint Prüfung, aber der ursprüngliche Titelkarte Raum

Dann wird zu einer Abfragesequenz von kleinen bis zu großer Speicherseitenkante DP Antwortzeitkomplexität \ (O (n ^ 2) \)

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

inline int read() {
    int x = 0, f = 1; char ch = getchar();
    for (; ch > '9' || ch < '0'; ch = getchar()) if (ch == '-') f = -1;
    for (; ch <= '9' && ch >= '0'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ '0');
    return x * f;
}

const ll mod = 1000000007;
int tot, now;
ll dp[5005], sum[5005], ans[5005];

struct question{
    int n, m, ind;
} q[5005];

inline bool cmp(question a, question b) {
    return a.n < b.n;
}

inline void DP() {
    dp[0] = dp[1] = 1;
    for (ll j = 0; j <= 5000; j++) {
        sum[j] = j == 0 ? 1 : 2;
    } 
    while (now <= tot && q[now].n == 2) {
        ans[q[now].ind] = dp[q[now].m];
        now++;
    }
    for (ll i = 3; i <= 5000; i++) {
        memset(dp, 0, sizeof(dp));
        for (ll j = 0; j <= min(i * (i - 1) / 2, 5000ll); j++) {
            if (j - i < 0) {
                dp[j] = sum[j];
            } else {
                dp[j] = (sum[j] - sum[j - i] + mod) % mod;
            }
        }
        memset(sum, 0, sizeof(sum));
        sum[0] = dp[0];
        for (ll j = 1; j <= 5000; j++) {
            sum[j] = (sum[j-1] + dp[j]) % mod;
        }
        while (now <= tot && q[now].n == i) {
            ans[q[now].ind] = dp[q[now].m];
            now++;
        }
    }   
}

int main() {
    tot = read();
    for (int i = 1, n, m; i <= tot; i++) {
        n = read(); m = read(); 
        q[i] = question{n, m, i};
    }
    sort(q + 1, q + tot + 1, cmp);
    now = 1; 
    while (now <= tot && q[now].n == 1) {
        ans[q[now].ind] = q[now].m == 0 ? 1 : 0;
        now++;
    }
    DP();
    for (int i = 1; i <= tot; i++) {
        printf("%lld\n", ans[i]);
    }
    return 0;
} 

Ich denke du magst

Origin www.cnblogs.com/ak-dream/p/AK_DREAM53.html
Empfohlen
Rangfolge