제출 #1295493

#제출 시각아이디문제언어결과실행 시간메모리
1295493WH8Sum Zero (RMI20_sumzero)C++20
22 / 100
203 ms25784 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define endl '\n'
#define ld long double
#define sz(x) static_cast<int>((x).size())
#define i5 tuple<int,int,int,int,int>
signed main(){
	int n;cin>>n;
	vector<int> v(n+1, 0), ps(n+1, 0);
	for(int i=1;i<=n;i++){
		cin>>v[i];
		ps[i]=ps[i-1]+v[i];
	}
	map<int,int> m;
	vector<vector<int>> up(n+1, vector<int>(20, -1));
	vector<int> dp(n+2, 0);
	int mnto=n+1;
	for(int i=n;i>=0;i--){
		int nxt=m[ps[i]];
		if(nxt != 0) mnto=min(mnto, nxt); 
		m[ps[i]]=i;
		up[i][0]=(mnto <= n ? mnto : -1);
	}
	//~ for(int i=0;i<=n;i++){
		//~ cout<<up[i][0]<<" ";
	//~ }
	//~ cout<<endl;
	//~ return 0;
	int q;cin>>q;
	for(int j=1;j<20;j++){
		for(int i=0;i<=n;i++){
			if(up[i][j-1] != -1)up[i][j]=up[up[i][j-1]][j-1];
		}
	}
	//~ printf("up[0][1] is %lld\n", up[0][1]);
	for(int qind=0;qind<q;qind++){
		int a,b;cin>>a>>b;
		a--;
		int ans=0;
		int cur=a;
		for(int j=19;j>=0;j--){
			//~ printf("up[%lld][%lld] = %lld]\n", cur, j, up[cur][j]);
			if(up[cur][j] != -1 and up[cur][j] <= b){
				ans+=(1<<j);
				cur=up[cur][j];
			}
		}
		cout<<ans<<'\n';
	}
	
}
/*
10
1 2 -3 0 1 -4 3 2 -1 1
3
1 10
1 5 
2 9
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...