답안 #694443

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
694443 2023-02-04T05:25:02 Z tommy1024 휴가 (IOI14_holiday) C++17
24 / 100
82 ms 65536 KB
#include <bits/stdc++.h>
#define all(v) (v).begin(),(v).end()
#include "holiday.h"
using namespace std;
typedef long long ll;
const ll LN=100005;

vector<ll> comp;
ll N,S,D,A[LN],C,ans;
struct node{
    ll cnt,sum;
    node *l,*r;
    node(){
        cnt=sum=0,l=r=nullptr;
    }
};
node *root[LN];
void build(node *n,ll l,ll r){
    if(l==r){
        return;
    }
    ll m=(l+r)/2;
    n->l=new node;n->r=new node;
    build(n->l,l,m);build(n->r,m+1,r);
}
void add(ll p,node *prv,node *n,ll l,ll r){
    if(l==r){
        n->cnt=prv->cnt+1;
        n->sum=prv->sum+comp[p];
        return;
    }
    ll m=(l+r)/2;
    if(p<=m){
        n->l=new node;
        n->r=prv->r;
        add(p,prv->l,n->l,l,m);
    }
    else{
        n->l=prv->l;
        n->r=new node;
        add(p,prv->r,n->r,m+1,r);
    }
    n->cnt=n->l->cnt+n->r->cnt;
    n->sum=n->l->sum+n->r->sum;
}
ll query(ll k,node *n1,node *n2,ll l,ll r){
    if(l==r){
        return comp[l]*k;
    }
    ll m=(l+r)/2;
    ll rcnt=n2->r->cnt-n1->r->cnt;
    if(rcnt>=k){
        return query(k,n1->r,n2->r,m+1,r);
    }
    else{
        return n2->r->sum-n1->r->sum+query(k-rcnt,n1->l,n2->l,l,m);
    }
}
void init(){
    //scanf("%lld%lld%lld",&N,&S,&D);
    for(ll i=0;i<N;i++){
        //scanf("%lld",&A[i]);
        comp.push_back(A[i]);
    }
    sort(all(comp));
    comp.erase(unique(all(comp)),comp.end());
    for(ll i=0;i<N;i++){
        A[i]=lower_bound(all(comp),A[i])-comp.begin();
    }
    C=comp.size();
}
void f(ll s,ll e,ll l,ll r){
    if(s>e||l>r)return;
    ll m=(s+e)/2;
    ll val=0,trk=l;
    for(ll i=max(l,m);i<=r;i++){
        ll k=D-(S+i-m*2); // 남은 거리
        if(k>i-m+1)k=i-m+1; // 남은 도시
        if(k<0)k=0;
        ll sum=query(k,root[m],root[i+1],0,C-1);
        if(sum>val)val=sum,trk=i;
    }
    ans=max(ans,val);
    f(s,m-1,l,trk);f(m+1,e,trk,r);
}
void clr(){
    root[0]=new node;
    build(root[0],0,C-1);
    for(ll i=0;i<N;i++){
        root[i+1]=new node;
        add(A[i],root[i],root[i+1],0,C-1);
    }
}
void calc(){
    clr();
    f(0,S,0,N-1);
}
void solve(){
    calc();
    reverse(A,A+N);
    S=N-1-S;
    calc();
    //printf("%lld",ans);
}
ll findMaxAttraction(int n,int start,int d,int attraction[]){
    N=n,S=start,D=d;
    for(int i=0;i<N;i++)A[i]=attraction[i];
    init();
    solve();
    return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 724 KB Output is correct
2 Correct 0 ms 596 KB Output is correct
3 Correct 1 ms 596 KB Output is correct
4 Correct 1 ms 596 KB Output is correct
5 Correct 1 ms 596 KB Output is correct
6 Correct 0 ms 596 KB Output is correct
7 Correct 0 ms 596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 12360 KB Output is correct
2 Correct 20 ms 12360 KB Output is correct
3 Correct 54 ms 21808 KB Output is correct
4 Correct 43 ms 21732 KB Output is correct
5 Runtime error 82 ms 65536 KB Execution killed with signal 9
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 4820 KB Output is correct
2 Correct 1 ms 980 KB Output is correct
3 Correct 6 ms 4876 KB Output is correct
4 Correct 8 ms 4564 KB Output is correct
5 Correct 7 ms 4180 KB Output is correct
6 Correct 2 ms 1876 KB Output is correct
7 Correct 4 ms 1748 KB Output is correct
8 Correct 3 ms 1748 KB Output is correct
9 Correct 2 ms 1364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 12360 KB Output is correct
2 Runtime error 78 ms 65536 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -