제출 #1025988

#제출 시각아이디문제언어결과실행 시간메모리
1025988socpite휴가 (IOI14_holiday)C++17
100 / 100
314 ms16188 KiB
#include"holiday.h" #include<bits/stdc++.h> using namespace std; const int maxn = 3e5+5; const long long INF = 1e18; long long A[maxn]; long long dpfx[maxn], dsfx[maxn]; int s, N, D; int pos[maxn]; long long FW[2][maxn]; void add(int idx, long long val){ for(idx; idx <= N; idx += idx&(-idx)){ FW[0][idx] += val; FW[1][idx]++; } } long long gt(int k){ if(k < 0)return -INF; int pos = 0; long long sum = 0; for(int i = 17; i >= 0; i--){ if(pos + (1<<i) > N)continue; if(k - FW[1][pos^(1<<i)] >= 0){ pos^=(1<<i); k -= FW[1][pos]; sum += FW[0][pos]; } } return sum; } void solve_pfx(){ queue<pair<pair<int, int>, pair<int, int>>> q; int prv = 0, ptr = 0; q.push({{0, D}, {s, 1}}); while(!q.empty()){ auto ele = q.front(); q.pop(); int l = ele.first.first, r = ele.first.second; if(l > r)continue; if(ele.second.second != prv){ prv = ele.second.second; memset(FW, 0, sizeof(FW)); ptr = 0; add(pos[s], A[s]); } int qr = ele.second.first; int mid = (l+r)>>1, best = ptr; dpfx[mid] = gt(mid - 2*ptr); while(ptr < qr){ ptr++; add(pos[s - ptr], A[s - ptr]); long long tmp = gt(mid - 2*ptr); if(tmp > dpfx[mid]){ dpfx[mid] = tmp; best = ptr; } } q.push({{l, mid-1}, {best, prv + 1}}); q.push({{mid+1, r}, {qr, prv + 1}}); } } void solve_sfx(){ queue<pair<pair<int, int>, pair<int, int>>> q; int prv = 0, ptr = 0; q.push({{0, D}, {N - s - 1, 1}}); while(!q.empty()){ auto ele = q.front(); q.pop(); int l = ele.first.first, r = ele.first.second; if(l > r)continue; if(ele.second.second != prv){ prv = ele.second.second; memset(FW, 0, sizeof(FW)); ptr = 0; } int qr = ele.second.first; int mid = (l+r)>>1, best = ptr; dsfx[mid] = gt(mid - ptr); while(ptr < qr){ ptr++; add(pos[s + ptr], A[s + ptr]); long long tmp = gt(mid - ptr); if(tmp > dsfx[mid]){ dsfx[mid] = tmp; best = ptr; } } q.push({{l, mid-1}, {best, prv + 1}}); q.push({{mid+1, r}, {qr, prv + 1}}); } } long long solve(){ solve_pfx(); solve_sfx(); long long ans = -INF; for(int i = 0; i <= D; i++){ ans = max(ans, dpfx[i] + dsfx[D - i]); } return ans; } long long int findMaxAttraction(int n, int start, int d, int attraction[]) { s = start; N = n; D = d; vector<pair<int, int>> vec; for(int i = 0; i < n; i++){ A[i] = attraction[i]; vec.push_back({A[i], i}); } sort(vec.rbegin(), vec.rend()); for(int i = 0; i < n; i++)pos[vec[i].second] = i+1; long long ans = solve(); reverse(pos, pos + n); reverse(A, A+n); s = n - s - 1; ans = max(ans, solve()); return ans; }

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

holiday.cpp: In function 'void add(int, long long int)':
holiday.cpp:16:9: warning: statement has no effect [-Wunused-value]
   16 |     for(idx; idx <= N; idx += idx&(-idx)){
      |         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...