제출 #1316217

#제출 시각아이디문제언어결과실행 시간메모리
1316217sefatSum Zero (RMI20_sumzero)C++20
0 / 100
3 ms1336 KiB
#pragma GCC optimize("O3,unroll-loops") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; // ----------- Fast Typing ------------ #define int long long #define pb push_back #define ff first #define ss second #define endl '\n' #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define vi vector<int> #define ii pair<int, int> #define vii vector<ii> #define yes cout << "YES\n" #define no cout << "NO\n" // ----------- Ordered Set (policy-based) ------------ template <typename T> using ordered_set = tree< T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update >; #ifndef ONLINE_JUDGE // Forward declarations of print helpers void _print(const string &s); void _print(const char *s); void _print(char c); void _print(bool x); void _print(long double x); void _print(long x); void _print(int x); // Pair template<typename T, typename V> void _print(const pair<T, V> &p) { cerr << "{"; _print(p.first); cerr << ", "; _print(p.second); cerr << "}"; } // Tuple template<class Tuple, size_t... I> void _print_tuple(const Tuple &t, std::index_sequence<I...>) { cerr << "("; (( _print(get<I>(t)), cerr << (I + 1 == sizeof...(I) ? "" : ", ") ), ...); cerr << ")"; } template<typename... Ts> void _print(const tuple<Ts...> &t) { _print_tuple(t, std::index_sequence_for<Ts...>{}); } // Vector template<typename T> void _print(const vector<T> &v) { cerr << "["; for (size_t i = 0; i < v.size(); ++i) { _print(v[i]); if (i + 1 < v.size()) cerr << ", "; } cerr << "]"; } // Deque template<typename T> void _print(const deque<T> &v) { cerr << "["; for (size_t i = 0; i < v.size(); ++i) { _print(v[i]); if (i + 1 < v.size()) cerr << ", "; } cerr << "]"; } // List template<typename T> void _print(const list<T> &l) { cerr << "["; bool first = true; for (auto &x : l) { if (!first) cerr << ", "; _print(x); first = false; } cerr << "]"; } // Set template<typename T> void _print(const set<T> &s) { cerr << "{"; bool first = true; for (auto &x : s) { if (!first) cerr << ", "; _print(x); first = false; } cerr << "}"; } // Unordered set template<typename T> void _print(const unordered_set<T> &s) { cerr << "{"; bool first = true; for (auto &x : s) { if (!first) cerr << ", "; _print(x); first = false; } cerr << "}"; } // Map template<typename T, typename V> void _print(const map<T, V> &m) { cerr << "{"; bool first = true; for (auto &kv : m) { if (!first) cerr << ", "; _print(kv); first = false; } cerr << "}"; } // Unordered map template<typename T, typename V> void _print(const unordered_map<T, V> &m) { cerr << "{"; bool first = true; for (auto &kv : m) { if (!first) cerr << ", "; _print(kv); first = false; } cerr << "}"; } // C-style string void _print(const char *s) { cerr << '"' << s << '"'; } void _print(const string &s) { cerr << '"' << s << '"'; } void _print(char c) { cerr << '\'' << c << '\''; } void _print(bool x) { cerr << (x ? "true" : "false"); } // Numbers void _print(long double x) { cerr << (double)x; } void _print(long x) { cerr << x; } void _print(int x) { cerr << x; } // Generic fallback for pointers / other printable types template<typename T> void _print(const T* p) { if (p == nullptr) cerr << "nullptr"; else cerr << "ptr(" << (void*)p << ")"; } // Variadic debug printer void _debug() { cerr << '\n'; } template<typename Head, typename... Tail> void _debug(Head H, Tail... T) { _print(H); if constexpr (sizeof...(T) > 0) cerr << ", "; _debug(T...); } #define debug(...) cerr << "[" << __FILE__ << ":" << __LINE__ << "] " << "[" << #__VA_ARGS__ << "] = ", _debug(__VA_ARGS__) #else #define debug(...) ((void)0) #endif // ----------- Random Generator ------------ mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int randInt(int l, int r) { return uniform_int_distribution<int>(l, r)(rng); } // ----------- Constants ------------ const int MOD = 1e9 + 7; const int INF = 1e18; const int N = 2e5 + 5; // ----------- Useful Functions ------------ int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } int lcm(int a, int b) { return (a / gcd(a, b)) * b; } // ----------- Main Solve Function ------------ void solve() { int n; if (!(cin >> n)) return; vi a(n+1), pr(n+1, 0); for(int i = 1; i <= n; ++i) { cin >> a[i]; pr[i] = pr[i-1] + a[i]; // clearer prefix sum } map<int, int> mp; // use n+2 sized jump to safely index up to n+1 vector<vector<int>> jump(21, vector<int>(n+2, -1)); // initialize all to -1 (already done) jump[0][n] = n + 1; mp[pr[n]] = n; int pos_zero = n+1; if(a[n] == 0) pos_zero = n; for(int i = n - 1; i >= 1; --i) { if (mp.find(pr[i-1]) == mp.end()) jump[0][i] = min(jump[0][i+1], pos_zero); else { jump[0][i] = min({jump[0][i+1], mp[pr[i-1]], pos_zero}); } // debug(i, mp[i], jump[0][i]); if(a[i] == 0) pos_zero = i; mp[pr[i]] = i; } // build binary lifting table for(int j = 1; j <= 20; ++j) { for(int i = 1; i <= n; ++i) { if (jump[j-1][i] != -1) { int nxt = jump[j-1][i]; jump[j][i] = (nxt <= n+1) ? jump[j-1][nxt] : -1; } } } // for(int i=1; i<=n; i++) { // debug(i); // debug(jump[0][i], jump[1][i], jump[2][i]); // } int q; cin >> q; while(q--) { int l, r; cin >> l >> r; int cur = l, ans = a[cur] == 0; // debug(cur); for(int j = 20; j >= 0; --j) { // debug(cur, j, jump[j][cur]); if (jump[j][cur] != -1 && jump[j][cur] <= r) { ans += (1LL << j); cur = jump[j][cur]; } } cout << ans << '\n'; } } // ----------- Main Function ------------ int32_t main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t = 1; // cin >> t; for(int i = 1; i <= t; ++i) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...