제출 #1273407

#제출 시각아이디문제언어결과실행 시간메모리
1273407nthvn3단 점프 (JOI19_jumps)C++20
100 / 100
763 ms104148 KiB
#include "bits/stdc++.h"
using namespace std;

#define fi first
#define se second
#define pii pair<int,int> 
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define pb push_back
#define ll long long
const int N= 5e5+5;
int n, a[N], q;
vector<pii> qr[N];
int fans[N];
int tb[N][25];

int getmx(int l, int r){
	int j = __lg(r-l+1);
	return max(tb[l][j], tb[r-(1<<j)+1][j]);
}


struct SegTree{
	int tr[4*N], lz[4*N];
	
	void app_lz(int id, int l, int r, int v){
		tr[id] = max(tr[id], v+getmx(l,r));
		lz[id] = max(lz[id], v);
	}
	void down(int id, int l, int r){
		if(!lz[id]) return;
		int mid=(l+r)>>1;
		app_lz(2*id,l,mid,lz[id]);
		app_lz(2*id+1,mid+1,r,lz[id]);
		lz[id] = 0;
	}
	void update(int id, int l, int r, int t_l, int t_r, int v){
		if(l>t_r||r<t_l) return;
		if(t_l<=l&&r<=t_r) {
			tr[id] = max(tr[id], v+getmx(l,r));
			lz[id] = max(lz[id], v);
			return;
		}
		int mid=(l+r)>>1;
		down(id,l,r);
		update(2*id,l,mid,t_l,t_r,v);
		update(2*id+1,mid+1,r,t_l,t_r,v);
		tr[id] = max(tr[2*id], tr[2*id+1]);
	}
	int get(int id, int l, int r, int t_l, int t_r){
		if(l>t_r||r<t_l) return 0;
		if(t_l<=l&&r<=t_r) return tr[id];
		int mid =(l+r)>>1;
		down(id,l,r);
		return max(get(2*id,l,mid,t_l,t_r), get(2*id+1,mid+1,r,t_l,t_r));
	}
}st;



void preprocess(){
	for(int i=n;i>=1;i--){
		tb[i][0] = a[i];
		for(int j=1;i+(1<<j)-1<=n;j++){
			tb[i][j] = max(tb[i][j-1], tb[i+(1<<(j-1))][j-1]);
		}
	}
	static int st[N];
	for(int i=1;i<=n;i++){
		while(st[0]&&a[st[st[0]]]<=a[i]){
			// cerr<<st[st[0]]<<" "<<i<<"\n";
			qr[st[st[0]--]].pb({i,0});
		}
		if(st[0]){
			qr[st[st[0]]].pb({i,0});
		}
		st[++st[0]] = i;
	}
}

void solve(){
	for(int i=1;i<=n;i++) sort(all(qr[i]),[&](pii &a, pii &b){
		return a.se < b.se;
	});
	for(int t= n; t>=1;t--){
		for(auto &x: qr[t]){
			int r= x.fi, id = x.se;
			if(!id){
				int k = 2*r-t;
				st.update(1,1,n,k,n,a[t]+a[r]);
			}
			else{
				fans[id] = st.get(1,1,n,1,r);
			}
		}
	}
	for(int i=1;i<=q;i++) cout<<fans[i]<<"\n";
}

signed main(){
	ios_base::sync_with_stdio(NULL);
	cin.tie(NULL);
	if(fopen("TASK.INP", "r")){
		freopen("TASK.INP", "r", stdin);
		freopen("TASK.OUT", "w", stdout);
	}
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	
	cin>>q;
	for(int i=1;i<=q;i++) {
		int l,r; cin>>l>>r;
		qr[l].pb({r,i});
	}
	preprocess();
	solve();
}

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

jumps.cpp: In function 'int main()':
jumps.cpp:104:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  104 |                 freopen("TASK.INP", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
jumps.cpp:105:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  105 |                 freopen("TASK.OUT", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...