#pragma once
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define ll long long
const int N=1e6+200;
int MN=3003;
int seg_cnt[N];
long long seg_sum[N];
void Update(int i,ll val=-1,int v=1,int s=0,int e=MN)
{
if(i<s or e<i)
return;
if(s==e)
{
seg_cnt[v]++;
if(val==-1)
seg_sum[v]+=i;
else
{
seg_sum[v]+=val;
}
return;
}
int mid=(s+e)/2;
Update(i,val,2*v,s,mid);
Update(i,val,2*v+1,1+mid,e);
seg_cnt[v]=seg_cnt[2*v]+seg_cnt[2*v+1];
seg_sum[v]=seg_sum[2*v]+seg_sum[2*v+1];
}
void Update1(int i,ll val=-1,int v=1,int s=0,int e=MN)
{
if(i<s or e<i)
return;
if(s==e)
{
seg_cnt[v]--;
if(val==-1)
seg_sum[v]-=i;
else
seg_sum[v]-=val;
return;
}
int mid=(s+e)/2;
Update1(i,val,2*v,s,mid);
Update1(i,val,2*v+1,1+mid,e);
seg_cnt[v]=seg_cnt[2*v]+seg_cnt[2*v+1];
seg_sum[v]=seg_sum[2*v]+seg_sum[2*v+1];
}
int get_cnt(int l,int r,int v=1,int s=0,int e=MN)
{
if(r<s or e<l)
return 0;
if(l<=s and e<=r)
return seg_cnt[v];
int mid=(s+e)/2;
return get_cnt(l,r,2*v,s,mid)+get_cnt(l,r,2*v+1,mid+1,e);
}
long long get_sum(int l,int r,int v=1,int s=0,int e=MN)
{
if(r<s or e<l)
return 0;
if(l<=s and e<=r)
return seg_sum[v];
int mid=(s+e)/2;
return get_sum(l,r,2*v,s,mid)+get_sum(l,r,2*v+1,mid+1,e);
}
long long findMaxAttraction(int n, int cc, int d, int a[])
{
vector<int> op,dp;
for(int i=0;i<n;i++)
op.push_back(a[i]);
sort(begin(op),end(op));
op.resize(unique(begin(op),end(op))-begin(op));
for(int i=0;i<n;i++)
dp.push_back(lower_bound(begin(op),end(op),a[i])-begin(op));
long long ans=0;
for(int left=cc;left>=0;left--)
{
Update(dp[left],a[left]);
{
int right=cc;
ll tmie=min(right-cc,cc-left)+right-left;
if(tmie<=d)
{
int s=-1;
int e=MN+1;
while(s+1<e)
{
int mid=(s+e)/2;
if((get_cnt(mid,MN)+tmie)>d)
{
s=mid;
}
else
{
e=mid;
}
}
long long cur=get_sum(s+1,MN);
if(s!=-1)
{
cur+=(op[s]*(d-tmie-get_cnt(s+1,MN)));
}
ans=max(ans,cur);
}
}
for(int right=cc+1;right<n;right++)
{
Update(dp[right],a[right]);
ll tmie=min(right-cc,cc-left)+right-left;
if(tmie>d)
continue;
int s=-1;
int e=MN+1;
while(s+1<e)
{
int mid=(s+e)/2;
if((get_cnt(mid,MN)+tmie)>d)
{
s=mid;
}
else
{
e=mid;
}
}
long long cur=get_sum(s+1,MN);
if(s!=-1)
{
cur+=(op[s]*(d-tmie-get_cnt(s+1,MN)));
}
ans=max(ans,cur);
}
for(int right=cc+1;right<n;right++)
Update1(dp[right],a[right]);
}
return ans;
}
Compilation message
holiday.cpp:1:9: warning: #pragma once in main file
1 | #pragma once
| ^~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
2652 KB |
Output is correct |
2 |
Correct |
1 ms |
2652 KB |
Output is correct |
3 |
Correct |
1 ms |
2652 KB |
Output is correct |
4 |
Correct |
1 ms |
2908 KB |
Output is correct |
5 |
Correct |
1 ms |
2648 KB |
Output is correct |
6 |
Correct |
1 ms |
2656 KB |
Output is correct |
7 |
Correct |
1 ms |
2652 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
65 ms |
3672 KB |
Output is correct |
2 |
Correct |
73 ms |
3672 KB |
Output is correct |
3 |
Correct |
63 ms |
3800 KB |
Output is correct |
4 |
Correct |
71 ms |
3796 KB |
Output is correct |
5 |
Correct |
72 ms |
3644 KB |
Output is correct |
6 |
Correct |
31 ms |
3164 KB |
Output is correct |
7 |
Correct |
43 ms |
3420 KB |
Output is correct |
8 |
Correct |
50 ms |
3420 KB |
Output is correct |
9 |
Correct |
22 ms |
3164 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
2904 KB |
Output is correct |
2 |
Correct |
3 ms |
2908 KB |
Output is correct |
3 |
Correct |
4 ms |
3160 KB |
Output is correct |
4 |
Correct |
1213 ms |
2964 KB |
Output is correct |
5 |
Correct |
835 ms |
2960 KB |
Output is correct |
6 |
Correct |
23 ms |
2908 KB |
Output is correct |
7 |
Correct |
90 ms |
2908 KB |
Output is correct |
8 |
Correct |
100 ms |
2908 KB |
Output is correct |
9 |
Correct |
74 ms |
2908 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
58 ms |
3924 KB |
Output is correct |
2 |
Incorrect |
62 ms |
3676 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |