제출 #572081

#제출 시각아이디문제언어결과실행 시간메모리
572081Lobo휴가 (IOI14_holiday)C++17
100 / 100
464 ms8728 KiB
#include"holiday.h" #include<bits/stdc++.h> using namespace std; const long long inf = (long long) 1e18 + 10; const int inf1 = (int) 1e9 + 10; #define int long long #define dbl long double #define endl '\n' #define sc second #define fr first #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() const int maxn = 1e5+10; int n, S, D, mxv, dp[maxn], a[maxn], trq[4*maxn], trs[4*maxn], ccval[4*maxn]; void att(int no, int l, int r, int pos, int val) { if(l > pos || r < pos) return; if(l == r) { trq[no]+= val; trs[no]+= val*ccval[l]; return; } int f1=2*no,f2=2*no+1,mid=(l+r)>>1; att(f1,l,mid,pos,val); att(f2,mid+1,r,pos,val); trq[no] = trq[f1]+trq[f2]; trs[no] = trs[f1]+trs[f2]; } int find(int no, int l, int r, int val) { if(l == r) { return ccval[l]*val; } int f1 = 2*no; int f2 = 2*no+1; int mid = (l+r)/2; //tenta ir para esquerda e pegar a direita if(val-trq[f2] > 0) return trs[f2] + find(f1,l,mid,val-trq[f2]); else return find(f2,mid+1,r,val); } int L,R; void sol(int l, int r, int opl, int opr) { if(l > r) return; int i = (l+r)/2; //coloca o L no mid e o R no opl-1 while(L < i) { att(1,1,mxv,a[L],-1); L++; } while(L > i) { L--; att(1,1,mxv,a[L],+1); } while(R > opl) { att(1,1,mxv,a[R],-1); R--; } while(R < opl) { R++; att(1,1,mxv,a[R],+1); } int opi = -1; for(int j = opl; j <= opr; j++) { if(j != opl) { R++; att(1,1,mxv,a[R],+1); } int q = max(D-S+2*i-j,D-2*j+S+i); q = min(q,j-i+1); int val = find(1,1,mxv,q); if(val > dp[i]) { dp[i] = val; opi = j; } } sol(l,i-1,opl,opi); sol(i+1,r,opi,opr); } int findMaxAttraction(int32_t N, int32_t start, int32_t d, int32_t attraction[]) { n = N; D = d; S = start; vector<int> cc; for(int i = 0; i < n; i++) { a[i] = attraction[i]; cc.pb(a[i]); } sort(all(cc)); cc.erase(unique(all(cc)),cc.end()); mxv = cc.size(); for(int i = 0; i < n; i++) { dp[i] = -inf; int aux = a[i]; a[i] = upper_bound(all(cc),a[i]) - cc.begin(); ccval[a[i]] = aux; } L = S; R = S-1; sol(0,S,S,n-1); int ans = 0; for(int i = 0; i < n; i++) { ans = max(ans,dp[i]); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...