// 2021-3-mop-mopadulo.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> #include <map> #include <algorithm> constexpr long long MD = 1e9 + 7; constexpr int MAXN = 1e6; constexpr int DOD = 1 << 19; constexpr int SIZ = 2 * DOD + 7; long long prefsum[MAXN]; long long psstrd[MAXN]; void tree_incr(long long* t, int p, long long v) { p += DOD; while (p > 0) { t[p] += v; t[p] = t[p] % MD; p /= 2; } } long long tree_get(long long* t, int b, int e) { b += DOD; e += DOD; if (b == e) { return t[b]; } long long answ = 0; answ += t[b]; answ += t[e]; answ %= MD; while (b/2 < e/2) { if (b%2 == 0) { answ += t[b + 1]; } if (e%2 == 1) { answ += t[e - 1]; } answ %= MD; b /= 2; e /= 2; } return answ % MD; } long long tr[2][SIZ]; long long hmend[MAXN]; int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0); int n; long long l; std::cin >> n; std::map<long long, int> mp; for (size_t i = 1; i <= n; i++) { std::cin >> l; prefsum[i] = (prefsum[i - 1] + l) % MD; psstrd[i] = prefsum[i]; } std::sort(psstrd, psstrd + n + 1); int cnt = 0; for (size_t i = 0; i <= n; i++) { if (mp.find(psstrd[i]) == mp.end()) { cnt++; mp[psstrd[i]] = cnt; } } tree_incr(tr[0], mp[0ll], 1ll); for (size_t i = 1; i <= n; i++) { int tmp = mp[prefsum[i]]; hmend[i] = tree_get(tr[prefsum[i] % 2], 0, tmp) + tree_get(tr[1 - (prefsum[i] % 2)], tmp, n+6); tree_incr(tr[prefsum[i] % 2], tmp, hmend[i]); } std::cout << hmend[n] % MD << '\n'; } // Run program: Ctrl + F5 or Debug > Start Without Debugging menu // Debug program: F5 or Debug > Start Debugging menu // Tips for Getting Started: // 1. Use the Solution Explorer window to add/manage files // 2. Use the Team Explorer window to connect to source control // 3. Use the Output window to see build output and other messages // 4. Use the Error List window to view errors // 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project // 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | // 2021-3-mop-mopadulo.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> #include <map> #include <algorithm> constexpr long long MD = 1e9 + 7; constexpr int MAXN = 1e6; constexpr int DOD = 1 << 19; constexpr int SIZ = 2 * DOD + 7; long long prefsum[MAXN]; long long psstrd[MAXN]; void tree_incr(long long* t, int p, long long v) { p += DOD; while (p > 0) { t[p] += v; t[p] = t[p] % MD; p /= 2; } } long long tree_get(long long* t, int b, int e) { b += DOD; e += DOD; if (b == e) { return t[b]; } long long answ = 0; answ += t[b]; answ += t[e]; answ %= MD; while (b/2 < e/2) { if (b%2 == 0) { answ += t[b + 1]; } if (e%2 == 1) { answ += t[e - 1]; } answ %= MD; b /= 2; e /= 2; } return answ % MD; } long long tr[2][SIZ]; long long hmend[MAXN]; int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0); int n; long long l; std::cin >> n; std::map<long long, int> mp; for (size_t i = 1; i <= n; i++) { std::cin >> l; prefsum[i] = (prefsum[i - 1] + l) % MD; psstrd[i] = prefsum[i]; } std::sort(psstrd, psstrd + n + 1); int cnt = 0; for (size_t i = 0; i <= n; i++) { if (mp.find(psstrd[i]) == mp.end()) { cnt++; mp[psstrd[i]] = cnt; } } tree_incr(tr[0], mp[0ll], 1ll); for (size_t i = 1; i <= n; i++) { int tmp = mp[prefsum[i]]; hmend[i] = tree_get(tr[prefsum[i] % 2], 0, tmp) + tree_get(tr[1 - (prefsum[i] % 2)], tmp, n+6); tree_incr(tr[prefsum[i] % 2], tmp, hmend[i]); } std::cout << hmend[n] % MD << '\n'; } // Run program: Ctrl + F5 or Debug > Start Without Debugging menu // Debug program: F5 or Debug > Start Debugging menu // Tips for Getting Started: // 1. Use the Solution Explorer window to add/manage files // 2. Use the Team Explorer window to connect to source control // 3. Use the Output window to see build output and other messages // 4. Use the Error List window to view errors // 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project // 6. In the future, to open this project again, go to File > Open > Project and select the .sln file |