# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
226749 |
2020-04-25T06:35:52 Z |
urd05 |
Holiday (IOI14_holiday) |
C++14 |
|
893 ms |
53068 KB |
#include <bits/stdc++.h>
using namespace std;
int root[100001];
int n;
int st;
int d;
int arr[100000];
vector<long long> press;
long long dp[100000];
struct Node {
int cnt;
long long sum;
int l,r;
};
vector<Node> pst;
void init(int node=0,int nodel=0,int noder=n-1) {
if (nodel==noder) {
return;
}
int mid=(nodel+noder)/2;
if (pst[node].l==-1) {
pst[node].l=pst.size();
pst.push_back({0,0,-1,-1});
}
init(pst[node].l,nodel,mid);
if (pst[node].r==-1) {
pst[node].r=pst.size();
pst.push_back({0,0,-1,-1});
}
init(pst[node].r,mid+1,noder);
}
void add(int prev,int node,int pos,int nodel=0,int noder=n-1) {
pst[node].cnt=pst[prev].cnt+1;
pst[node].sum=pst[prev].sum+press[pos];
if (nodel==noder) {
return;
}
int mid=(nodel+noder)/2;
if (pos<=mid) {
pst[node].l=pst.size();
pst.push_back({0,0,-1,-1});
pst[node].r=pst[prev].r;
add(pst[prev].l,pst[node].l,pos,nodel,mid);
}
else {
pst[node].l=pst[prev].l;
pst[node].r=pst.size();
pst.push_back({0,0,-1,-1});
add(pst[prev].r,pst[node].r,pos,mid+1,noder);
}
}
long long findsum(int lnode,int rnode,int k,int nodel=0,int noder=n-1) {
if (nodel==noder) {
return press[nodel]*k;
}
int mid=(nodel+noder)/2;
if (pst[pst[rnode].r].cnt-pst[pst[lnode].r].cnt>=k) {
return findsum(pst[lnode].r,pst[rnode].r,k,mid+1,noder);
}
else {
return pst[pst[rnode].r].sum-pst[pst[lnode].r].sum+findsum(pst[lnode].l,pst[rnode].l,k-(pst[pst[rnode].r].cnt-pst[pst[lnode].r].cnt),nodel,mid);
}
}
long long getsum(int l,int r,int k) {
if (k<=0) {
return 0;
}
return findsum(root[l],root[r+1],min(pst[root[r+1]].cnt-pst[root[l]].cnt,k));
}
void getans_l(int l,int r,int al,int ar) {
if (l>r) {
return;
}
int mid=(l+r)/2;
long long ret=-1e16;
int opt=-1;
for(int i=max(mid,al);i<=ar;i++) {
long long val=getsum(mid,i,d+2*mid-i-st);
if (val>ret) {
ret=val;
opt=i;
}
}
dp[mid]=ret;
getans_l(l,mid-1,al,opt);
getans_l(mid+1,r,opt,ar);
}
void getans_r(int l,int r,int al,int ar) {
if (l>r) {
return;
}
int mid=(l+r)/2;
long long ret=-1e16;
int opt=-1;
for(int i=al;i<=min(mid,ar);i++) {
long long val=getsum(i,mid,d+st+i-2*mid);
if (val>ret) {
ret=val;
opt=i;
}
}
dp[mid]=ret;
getans_r(l,mid-1,al,opt);
getans_r(mid+1,r,opt,ar);
}
long long findMaxAttraction(int nn,int start,int dd,int at[]) {
n=nn;
st=start;
d=dd;
for(int i=0;i<n;i++) {
arr[i]=at[i];
press.push_back(arr[i]);
}
sort(press.begin(),press.end());
press.erase(unique(press.begin(),press.end()),press.end());
for(int i=0;i<n;i++) {
arr[i]=lower_bound(press.begin(),press.end(),arr[i])-press.begin();
}
pst.push_back({0,0,-1,-1});
init();
for(int i=0;i<n;i++) {
root[i+1]=pst.size();
pst.push_back({0,0,-1,-1});
add(root[i],root[i+1],arr[i]);
}
long long ret=0;
long long sum=0;
priority_queue<long long,vector<long long>,greater<long long>> pq;
for(int i=st;i>=0;i--) {
pq.push(arr[i]);
sum+=arr[i];
while ((int)pq.size()>d-st+i&&!pq.empty()) {
sum-=pq.top();
pq.pop();
}
ret=max(ret,sum);
}
while (!pq.empty()) {
pq.pop();
}
sum=0;
for(int i=st;i<n;i++) {
pq.push(arr[i]);
sum+=arr[i];
while ((int)pq.size()>d-i+st&&!pq.empty()) {
sum-=pq.top();
pq.pop();
}
ret=max(ret,sum);
}
getans_l(0,st,0,n-1);
for(int i=0;i<=st;i++) {
ret=max(ret,dp[i]);
}
getans_r(st,n-1,0,n-1);
for(int i=st;i<n;i++) {
ret=max(ret,dp[i]);
}
return ret;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Correct |
5 ms |
384 KB |
Output is correct |
4 |
Correct |
5 ms |
384 KB |
Output is correct |
5 |
Correct |
4 ms |
384 KB |
Output is correct |
6 |
Correct |
5 ms |
384 KB |
Output is correct |
7 |
Correct |
5 ms |
384 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
264 ms |
52264 KB |
Output is correct |
2 |
Correct |
301 ms |
52260 KB |
Output is correct |
3 |
Correct |
281 ms |
52296 KB |
Output is correct |
4 |
Correct |
264 ms |
52272 KB |
Output is correct |
5 |
Correct |
246 ms |
52264 KB |
Output is correct |
6 |
Correct |
67 ms |
13524 KB |
Output is correct |
7 |
Correct |
132 ms |
26460 KB |
Output is correct |
8 |
Correct |
178 ms |
51376 KB |
Output is correct |
9 |
Correct |
58 ms |
13280 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
11 ms |
2192 KB |
Output is correct |
2 |
Correct |
10 ms |
2192 KB |
Output is correct |
3 |
Correct |
10 ms |
2192 KB |
Output is correct |
4 |
Correct |
12 ms |
2192 KB |
Output is correct |
5 |
Correct |
12 ms |
2064 KB |
Output is correct |
6 |
Correct |
6 ms |
836 KB |
Output is correct |
7 |
Correct |
8 ms |
836 KB |
Output is correct |
8 |
Correct |
7 ms |
836 KB |
Output is correct |
9 |
Correct |
6 ms |
836 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
264 ms |
53040 KB |
Output is correct |
2 |
Correct |
401 ms |
53068 KB |
Output is correct |
3 |
Correct |
202 ms |
26580 KB |
Output is correct |
4 |
Correct |
12 ms |
2192 KB |
Output is correct |
5 |
Correct |
6 ms |
836 KB |
Output is correct |
6 |
Correct |
7 ms |
836 KB |
Output is correct |
7 |
Correct |
6 ms |
836 KB |
Output is correct |
8 |
Correct |
739 ms |
52936 KB |
Output is correct |
9 |
Correct |
893 ms |
52900 KB |
Output is correct |