제출 #1194065

#제출 시각아이디문제언어결과실행 시간메모리
1194065Bui_Quoc_CuongTriple Jump (JOI19_jumps)C++20
100 / 100
735 ms79056 KiB
//#pragma GCC optimize("O2") //#pragma GCC target("avx,avx2,fma") #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 5; int n, q; int a[N]; int Lq[N], Rq[N]; namespace sub1{ int ma[N]; void solve(){ for(int _ = 1; _ <= q; _++) { // int L, R; cin >> L >> R; int L = Lq[_], R = Rq[_]; long long ans = 0; for(int i = L; i <= R; i++){ for(int j = L; j <= i - 1; j++){ ma[i - j] = a[j] + a[i]; } for(int len = 0; len <= R - L + 1; len++){ ma[len] = max(ma[len], ma[len - 1]); } for(int j = i + 1; j <= R; j++){ ans = max(ans, a[j] + 1LL * ma[j - i]); } } cout << ans << "\n"; for(int len = 0; len <= R - L + 1; len++){ ma[len] = - 2e9; } } } } namespace sub2{ long long lazy[4 * N], st[4 * N], mx[4 * N]; void down(int id){ if(lazy[id] == 0) return; st[id << 1] = max(st[id << 1], mx[id << 1] + lazy[id]); st[id << 1 | 1] = max(st[id << 1 | 1], mx[id << 1 | 1] + lazy[id]); lazy[id << 1] = max(lazy[id << 1], lazy[id]); lazy[id << 1 | 1] = max(lazy[id << 1 | 1], lazy[id]); lazy[id] = 0; } void build(int id, int l, int r){ if(l == r){ mx[id] = a[l]; return; } int mid = (l + r) >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); mx[id] = max(mx[id << 1], mx[id << 1 | 1]); } void update(int id, int l, int r, int u, int v, long long val){ if(l > v || r < u) return; if(l >= u && r <= v){ st[id] = max(st[id], mx[id] + val); lazy[id] = max(lazy[id], val); return; } down(id); int mid = (l + r) >> 1; update(id << 1, l, mid, u, v, val); update(id << 1 | 1, mid + 1, r, u, v, val); st[id] = max(st[id << 1], st[id << 1 | 1]); } long long get(int id, int l, int r, int u, int v){ if(l > v || r < u) return 0; if(l >= u && r <= v) return st[id]; down(id); int mid = (l + r) >> 1; return max(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v)); } long long ans[N]; vector <pair <int, int>> qry[N]; void solve(){ build(1, 1, n); for(int i = 1; i <= q; i++){ qry[Lq[i]].push_back(make_pair(Rq[i], i)); } stack <int> st; for(int i = n; i >= 1; i--){ while(!st.empty() && a[i] >= a[st.top()]){ update(1, 1, n, max(1, 2 * st.top() - i), n, a[i] + a[st.top()]); st.pop(); } if(st.size()) update(1, 1, n, max(1, 2 * st.top() - i), n, a[i] + a[st.top()]); st.push(i); for(auto x : qry[i]){ ans[x.second] = max(ans[x.second], get(1, 1 , n, i, x.first)); } } for(int i = 1; i <= q; i++){ cout << ans[i] << "\n"; } } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define KO "" if(fopen(KO".inp", "r")){ freopen(KO".inp", "r", stdin); freopen(KO".out", "w", stdout); } cin >> n; for(int i = 1; i <= n; i++){ cin >> a[i]; } cin >> q; for(int i = 1; i <= q; i++){ cin >> Lq[i] >> Rq[i]; } // return sub1 :: solve(), 0; return sub2 :: solve(), 0; return void(cerr << "\nKO : " << 0.001 * clock() << "s "), 0; }

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

jumps.cpp: In function 'int main()':
jumps.cpp:125:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  125 |         freopen(KO".inp", "r", stdin); freopen(KO".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
jumps.cpp:125:47: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  125 |         freopen(KO".inp", "r", stdin); freopen(KO".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...