제출 #1177126

#제출 시각아이디문제언어결과실행 시간메모리
1177126altern23Sum Zero (RMI20_sumzero)C++17
61 / 100
422 ms58524 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define ll int
#define pii pair<ll, ll>
#define fi first
#define sec second
#define ld long double

const int MAXN = 1e5;
const ll INF = 4e18;
const int MOD = 1e9 + 7;

int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int tc = 1;	
	// cin >> tc;	
	for(;tc--;){
		ll N; cin >> N;
		vector<ll> ps(N + 1);
		for(int i = 1; i <= N; i++){
			ll x; cin >> x;
			ps[i] = ps[i - 1] + x;
		}
		
		vector<vector<ll>> up(N + 2, vector<ll>(19));
		map<ll, ll> mp;
		
		ll MN = N + 1;
		for(int i = N; i >= 0; --i){
			if(mp.count(ps[i])){
				MN = min(MN, mp[ps[i]]);
			}
			mp[ps[i]] = i;
			up[i][0] = MN;
		}
		
		for(int LOG = 0; LOG < 19; LOG++){
			up[N + 1][LOG] = N + 1;
		}
		for(int LOG = 1; LOG < 19; LOG++){
			for(int i = 0; i <= N; i++){
				up[i][LOG] = up[up[i][LOG - 1]][LOG - 1];
			}
		}
		
		ll Q; cin >> Q;
		for(int i = 1; i <= Q; i++){
			ll l, r; cin >> l >> r;
			--l;
			ll ans = 0;
			for(int LOG = 18; LOG >= 0; --LOG){
				if(up[l][LOG] <= r){
					ans += (1LL << LOG);
					l = up[l][LOG];
				}
			}
			cout << ans << "\n";
		}
	}   
	
}

/*

*/

컴파일 시 표준 에러 (stderr) 메시지

sumzero.cpp:11:16: warning: overflow in conversion from 'double' to 'int' changes value from '4.0e+18' to '2147483647' [-Woverflow]
   11 | const ll INF = 4e18;
      |                ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...