답안 #856373

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
856373 2023-10-03T09:18:19 Z onepunchac168 휴가 (IOI14_holiday) C++14
100 / 100
428 ms 10228 KB
#include"holiday.h"
#include <bits/stdc++.h>
using namespace std;

#define            task     ""
#define       file(name)    if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
#define             ldb     long double
#define              pb     push_back
#define              eb     emplace_back
#define              fi     first
#define              se     second
#define           all(x)    begin(x),end(x)
#define       uniquev(v)    v.resize(unique(all(v))-v.begin())
#define       rep(i,a,b)    for (int i=a;i<=b;i++)
#define        cntbit(v)    __builtin_popcountll(v)
#define         gcd(a,b)    __gcd(a,b)
#define         lcm(a,b)    ((1LL*a*b)/__gcd(a,b))
#define          mask(x)    (1LL<<(x))
#define     readbit(x,i)    ((x>>i)&1)
#define             Yes     cout << "Yes"
#define             YES     cout << "YES"
#define              No     cout << "No"
#define              NO     cout << "NO"

typedef long long ll;
typedef pair <ll,ll> ii;

const char nl='\n';
/*
void onepunchac168();

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    if (fopen(task".inp","r"))
    {
        freopen(task".inp","r",stdin);
        freopen(task".out","w",stdout);
    }
    onepunchac168();
}*/

ll n,s,d;
const int N=1e5+5;
ll a[N];
ll b[N];
int l1,r1;
ii T[4*N];
vector <ll> vt;
void update(int node,int l,int r,int u,ii val)
{
    if (l>u||r<u)
    {
        return;
    }
    if (l==r)
    {
        T[node].fi+=val.fi;
        T[node].se+=val.se;
        return;
    }
    update(node*2,l,(l+r)/2,u,val);
    update(node*2+1,(l+r)/2+1,r,u,val);
    T[node].fi=T[node*2].fi+T[node*2+1].fi;
    T[node].se=T[node*2].se+T[node*2+1].se;
}
void updatea(int u,int v)
{
    while (u<l1)
    {
        update(1,1,vt.size(),b[l1-1],{1,a[l1-1]});
        l1--;
    }
    while (u>l1)
    {
        update(1,1,vt.size(),b[l1],{-1,-a[l1]});
        l1++;
    }
    while (v<r1)
    {
        update(1,1,vt.size(),b[r1],{-1,-a[r1]});
        r1--;
    }
    while (v>r1)
    {
        update(1,1,vt.size(),b[r1+1],{1,a[r1+1]});
        r1++;
    }
}
ll query(int node,int l,int r,int sl)
{
    if (l==r)
    {
        ll cost=0;
        cost=T[node].se;
        if (T[node].fi>sl)
        {
            ll pp=T[node].fi-sl;
            cost-=vt[l-1]*pp;
        }
        return cost;
    }
    if (T[node*2+1].fi>=sl)
    {
        return query(node*2+1,(l+r)/2+1,r,sl);
    }
    return T[node*2+1].se+query(node*2,l,(l+r)/2,sl-T[node*2+1].fi);
}
ll res=0;
void solve(int left,int right,int pos1,int pos2)
{
    if (left>right)
    {
        return;
    }
    int mid=(left+right)/2;
    int id=-1;
    ll ans=-1;
    for (int i=pos2;i>=pos1;i--)
    {
        updatea(mid,i);
        ll dd=i-mid+min(i-s,s-mid);
        if (dd>d)
        {
            continue;
        }
        ll cost=query(1,1,vt.size(),d-dd);
        if (cost>ans)
        {
            ans=cost;
            id=i;
        }
    }
    res=max(res,ans);
    if (id==-1)
    {
        solve(mid+1,right,pos1,pos2);
        return;
    }
    solve(left,mid-1,pos1,id);
    solve(mid+1,right,id,pos2);
}

long long int findMaxAttraction(int na, int start, int da, int attraction[]) {
    n=na;
    s=start+1;
    d=da;
    for (int i=0;i<n;i++)
    {
        a[i+1]=attraction[i];
    }
    for (int i=1;i<=n;i++)
    {
        vt.pb(a[i]);
    }
    sort (vt.begin(),vt.end());
    uniquev(vt);
    l1=1;
    r1=n;
    for (int i=1;i<=n;i++)
    {
        b[i]=lower_bound(vt.begin(),vt.end(),a[i])-vt.begin()+1;
        update(1,1,vt.size(),b[i],{1,a[i]});
    }
    solve(1,s,s,n);
    return res;
}
/*
void onepunchac168()
{
    cin>>n>>s>>d;
    s++;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    if (s==1)
    {
        sub1();
    }
    else sub2();


}
*/
# 결과 실행 시간 메모리 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 2648 KB Output is correct
5 Correct 1 ms 2652 KB Output is correct
6 Correct 1 ms 2652 KB Output is correct
7 Correct 1 ms 2652 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 5328 KB Output is correct
2 Correct 11 ms 5328 KB Output is correct
3 Correct 12 ms 5408 KB Output is correct
4 Correct 12 ms 5328 KB Output is correct
5 Correct 27 ms 5308 KB Output is correct
6 Correct 9 ms 3540 KB Output is correct
7 Correct 15 ms 4308 KB Output is correct
8 Correct 19 ms 4564 KB Output is correct
9 Correct 6 ms 3288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 3132 KB Output is correct
2 Correct 1 ms 2908 KB Output is correct
3 Correct 3 ms 2908 KB Output is correct
4 Correct 7 ms 3120 KB Output is correct
5 Correct 5 ms 2908 KB Output is correct
6 Correct 2 ms 2956 KB Output is correct
7 Correct 3 ms 2904 KB Output is correct
8 Correct 2 ms 2908 KB Output is correct
9 Correct 2 ms 2908 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 6056 KB Output is correct
2 Correct 46 ms 10184 KB Output is correct
3 Correct 104 ms 6608 KB Output is correct
4 Correct 6 ms 2904 KB Output is correct
5 Correct 2 ms 2908 KB Output is correct
6 Correct 2 ms 2908 KB Output is correct
7 Correct 2 ms 2908 KB Output is correct
8 Correct 404 ms 10192 KB Output is correct
9 Correct 428 ms 10228 KB Output is correct