제출 #944121

#제출 시각아이디문제언어결과실행 시간메모리
944121teacup3단 점프 (JOI19_jumps)C++14
5 / 100
4053 ms39332 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ii pair<int,int> typedef vector<int> vi; #define iii tuple<int,int,int> typedef vector<ii> vii; typedef vector<iii> viii; typedef map<int,int> mii; #ifndef debug #define cerr if (0) cerr #endif const int INF=1e17; struct node { int s, e; int mn, mx, sum, add_val, set_val; bool lset; node *l, *r; node (int _s, int _e, int A[] = NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL) { if (A == NULL) return; if (s == e) mn = mx = sum = A[s]; else { l = new node(s, (s+e)>>1, A), r = new node((s+e+2)>>1, e, A); combine(); } } void create_children() { if (s == e) return; if (l != NULL) return; int m = (s+e)>>1; l = new node(s, m); r = new node(m+1, e); } void self_set(int v) { lset = 1; mn = mx = set_val = v; sum = v * (e-s+1); add_val = 0; } void self_add(int v) { if (lset) { self_set(v + set_val); return; } mn += v, mx += v, add_val += v; sum += v*(e-s+1); } void lazy_propagate() { if (s == e) return; if (lset) { l->self_set(set_val), r->self_set(set_val); lset = set_val = 0; } if (add_val != 0) { l->self_add(add_val), r->self_add(add_val); add_val = 0; } } void combine() { if (l == NULL) return; sum = l->sum + r->sum; mn = min(l->mn, r->mn); mx = max(l->mx, r->mx); } #define UPDATE(name)\ void name(int x, int y, int v) { \ if (s == x && e == y) { self_##name(v); return; } \ int m = (s+e)>>1; \ create_children(); lazy_propagate(); \ if (x <= m) l->name(x, min(y, m), v); \ if (y > m) r->name(max(x, m+1), y, v); \ combine(); \ } UPDATE(add) //generates add UPDATE(set) //generates set #define QUERY(name, fn, var, lazyfn)\ int range_##name(int x, int y) {\ if (s == x && e == y) return var; \ if (l == NULL || lset) return lazyfn(var);\ int m = (s+e)>>1; lazy_propagate(); \ if (y <= m) return l->range_##name(x, y); \ if (x > m) return r->range_##name(x, y); \ return fn(l->range_##name(x, m), r->range_##name(m+1, y)) ; \ } #define SAME(var) (var) #define PART(var) ((var) /(e-s+1) * (y-x+1)) #define SUM(a, b) ((a)+(b)) QUERY(min, min, mn, SAME) //generates range_min QUERY(max, max, mx, SAME) //generates range_max QUERY(sum, SUM, sum, PART) //generates range_sum ~node() { if (l != NULL) delete l; if (r != NULL) delete r; } } *root; int N, Q, L, R, ans; int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin>>N; int A[N+5]; for (int i=1; i<=N; i++){ cin>>A[i]; } root = new node(1, N+5, A); cin>>Q; while (Q--){ cin>>L>>R; ans = 0; for (int i=L; i<=R; i++){ for (int j=i+1; j<=R; j++){ /*for (int k=j+1; k<=R; k++){ if (!(j-i <= k-j)) continue; ans=max(ans, A[i]+A[j]+A[k]); }*/ //printf("P %lld %lld %lld %lld\n",i,j,2*j-i, R); if (2*j-i>R) continue; ans=max(ans, A[i]+A[j]+root->range_max(max(j+1,2*j-i), R)); //printf("A %lld\n", ans); } } //printf("%lld\n", ans); cout<<ans<<"\n"; } }

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

jumps.cpp: In constructor 'node::node(long long int, long long int, long long int*)':
jumps.cpp:20:10: warning: 'node::lset' will be initialized after [-Wreorder]
   20 |     bool lset;
      |          ^~~~
jumps.cpp:19:22: warning:   'long long int node::add_val' [-Wreorder]
   19 |     int mn, mx, sum, add_val, set_val;
      |                      ^~~~~~~
jumps.cpp:22:5: warning:   when initialized here [-Wreorder]
   22 |     node (int _s, int _e, int A[] = NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL) {
      |     ^~~~
jumps.cpp: In member function 'void node::lazy_propagate()':
jumps.cpp:52:28: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   52 |             lset = set_val = 0;
      |                    ~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...