제출 #198679

#제출 시각아이디문제언어결과실행 시간메모리
198679dennisstar3단 점프 (JOI19_jumps)C++17
100 / 100
2075 ms90488 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define ryan bear
#define sq(X) ((X)*(X))
#define em emplace
#define eb emplace_back
#define all(V) (V).begin(), (V).end()
#define unq(V) (V).erase(unique(all(V)), (V).end())
using namespace std;
typedef long long ll;
typedef vector<ll> vlm;
typedef vector<int> vim;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
const int MAX = 1e9;

struct node {
	int a, b, c;
	node() { a=b=c=-MAX; }
	node(int a_, int b_, int c_) { a=a_, b=b_, c=c_; }
};

node operator + (const node &n1, const node &n2) {
	return node(max(n1.a, n2.a), max(n1.b, n2.b), max({n1.c, n2.c, n1.a+n2.b}));
}

struct SegTree {
	node nd[(1<<20)];
	void init(int i, int s, int e, int t, int val) {
		if (s==e) { nd[i].b=val; return ; }
		int md=(s+e)/2;
		if (t<=md) init(i*2, s, md, t, val);
		else init(i*2+1, md+1, e, t, val);
		nd[i]=nd[i*2]+nd[i*2+1];
	}
	void upd(int i, int s, int e, int t, int val) {
		if (s==e) { nd[i].a=max(nd[i].a, val); return ; }
		int md=(s+e)/2;
		if (t<=md) upd(i*2, s, md, t, val);
		else upd(i*2+1, md+1, e, t, val);
		nd[i]=nd[i*2]+nd[i*2+1];
	}
	node get(int i, int s, int e, int ts, int te) {
		if (te<s||e<ts) return node();
		if (ts<=s&&e<=te) return nd[i];
		int md=(s+e)/2;
		return get(i*2, s, md, ts, te)+get(i*2+1, md+1, e, ts, te);
	}
}S;

vector<pii> V[500010], Qu[500010]; vim stk;
int N, Q, A[500010], ans[500010];

int main() {
	scanf("%d", &N);
	for (int i=1; i<=N; i++) {
		scanf("%d", &A[i]);
		S.init(1, 1, N, i, A[i]);
		while (!stk.empty()) {
			int j=stk.back();
			if (2*i-j<=N) V[j].eb(2*i-j-1, A[i]+A[j]);
			if (A[j]>A[i]) break;
			stk.pop_back();
		}
		stk.eb(i);
	}

	scanf("%d", &Q);
	for (int i=0; i<Q; i++) {
		int l, r; scanf("%d %d", &l, &r);
		Qu[l].eb(r, i);
	}
	
	for (int i=N; i>=1; i--) {
		for (auto &j:V[i]) S.upd(1, 1, N, j.fi, j.se);
		for (auto &j:Qu[i]) ans[j.se]=S.get(1, 1, N, i, j.fi).c;
	}

	for (int i=0; i<Q; i++) printf("%d\n", ans[i]);
	return 0;
}

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

jumps.cpp: In function 'int main()':
jumps.cpp:56:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &N);
  ~~~~~^~~~~~~~~~
jumps.cpp:58:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &A[i]);
   ~~~~~^~~~~~~~~~~~~
jumps.cpp:69:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &Q);
  ~~~~~^~~~~~~~~~
jumps.cpp:71:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int l, r; scanf("%d %d", &l, &r);
             ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...