#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <map>
int c;
void SKIP_WHITESPACE() {
while (1) {
c = fgetc(stdin);
if (c != ' ' && c != '\n' && c != '\r')
break;
}
}
int READ_INT() {
SKIP_WHITESPACE();
int ret = c - '0';
while (1) {
c = fgetc(stdin);
if (c < '0' || c > '9')
break;
ret = ret * 10 + c - '0';
}
return ret;
}
#define KMAX 500000
int ns[KMAX];
int as[2*KMAX];
int k, n, i, j, ai, maks, w, sum, a;
std::map<int, int> m[2];
int cur = 0, prev = 1;
int main(int argc, char* argv[]) {
std::ios_base::sync_with_stdio (false);
k = READ_INT();
n = READ_INT();
ns[0] = n;
ai = 0;
for (j = 0; j < n; ++j) {
as[ai++] = 0;
}
for (i = 1; i < k; ++i) {
ns[i] = READ_INT();
for (j = 0; j < ns[i]; ++j) {
as[ai++] = READ_INT();
}
}
ai--;
maks = ns[k - 1];
for (i = k - 1; i >= 0 ; --i) {
m[cur].clear();
sum = 0;
for (j = ns[i]; j > 0; --j) {
w = m[prev][j];
w = (w == 0) ? 1 : w;
a = as[ai--];
sum += w;
if (a != 0) {
m[cur][a] += w;
}
}
std::swap(cur, prev);
if (sum > maks)
maks = sum;
}
std::cout << maks << "\n";
return EXIT_SUCCESS;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <iostream> #include <cstdio> #include <cstdlib> #include <map> int c; void SKIP_WHITESPACE() { while (1) { c = fgetc(stdin); if (c != ' ' && c != '\n' && c != '\r') break; } } int READ_INT() { SKIP_WHITESPACE(); int ret = c - '0'; while (1) { c = fgetc(stdin); if (c < '0' || c > '9') break; ret = ret * 10 + c - '0'; } return ret; } #define KMAX 500000 int ns[KMAX]; int as[2*KMAX]; int k, n, i, j, ai, maks, w, sum, a; std::map<int, int> m[2]; int cur = 0, prev = 1; int main(int argc, char* argv[]) { std::ios_base::sync_with_stdio (false); k = READ_INT(); n = READ_INT(); ns[0] = n; ai = 0; for (j = 0; j < n; ++j) { as[ai++] = 0; } for (i = 1; i < k; ++i) { ns[i] = READ_INT(); for (j = 0; j < ns[i]; ++j) { as[ai++] = READ_INT(); } } ai--; maks = ns[k - 1]; for (i = k - 1; i >= 0 ; --i) { m[cur].clear(); sum = 0; for (j = ns[i]; j > 0; --j) { w = m[prev][j]; w = (w == 0) ? 1 : w; a = as[ai--]; sum += w; if (a != 0) { m[cur][a] += w; } } std::swap(cur, prev); if (sum > maks) maks = sum; } std::cout << maks << "\n"; return EXIT_SUCCESS; } |
English