제출 #131806

#제출 시각아이디문제언어결과실행 시간메모리
131806DodgeBallMan휴가 (IOI14_holiday)C++14
0 / 100
95 ms49112 KiB
#include <bits/stdc++.h>
#include "holiday.h"
using namespace std;
//#define fuck 
const int N = 1e5 + 10;
struct item{
    long long va;
    int sz, l, r;
}seg[20*N];

void newleaf( int now, long long va, int sz ) {
    seg[now].va = va, seg[now].sz = sz, seg[now].l = -1, seg[now].r = -1;
    return ;
}

void newpar( int now, int l, int r ) {
    seg[now].va = seg[l].va + seg[r].va, seg[now].sz = seg[l].sz + seg[r].sz, seg[now].l = l, seg[now].r = r;
    return;
}

int ver[N], cnt = 1;
unordered_map<long long, int> mp;
long long va[N], ans = -1LL;
int n, s, d;
vector<long long> coord;

int build( int l = 1, int r = n ) {
    if( l == r ) {
        int now = cnt;
        cnt++;
        newleaf( now, 0, 0 );
        return now;
    }
    int mid = ( l + r ) >> 1, now = cnt;
    cnt++;
    newpar( now, build( l, mid ), build( mid + 1, r ) );
    return now;
}

int update( int idx, long long va, int now, int l = 1, int r = n ) {
    if( l == r ) {
        int now = cnt;
        cnt++;
        newleaf( now, va, 1 );
        return now;
    }
    int mid = ( l + r ) >> 1, noww = cnt;
    cnt++;
    if( idx <= mid ) newpar( noww, update( idx, va, seg[now].l, l, mid ), seg[now].r );
    else newpar( noww, seg[now].l, update( idx, va, seg[now].r, mid + 1, r ) );
    return noww;
}

long long query( int a, int b, int idx, int l = 1, int r = n ) {
    if( idx <= 0 ) return 0LL;
    if( l == r ) return seg[b].va - seg[a].va;
    int mid = ( l + r ) >> 1;
    int diff = seg[seg[b].r].sz - seg[seg[a].r].sz;
    if( diff >= idx ) return query( seg[a].r, seg[b].r, idx, mid + 1, r );
    else return seg[seg[b].r].va - seg[seg[a].r].va + query( seg[a].l, seg[b].l, idx - diff, l, mid );
}

int cal( int l, int r ) {
    int ret = r - l;
    int x = abs( s - l ), y = abs( s - r );
    return ret + min( x, y );
}

int get( long long x ) { 
    mp[x]++;
    return lower_bound( coord.begin(), coord.end(), x ) - coord.begin() + mp[x]; 
} 

// void solve( int l, int r, int lb, int rb ) {
//     //printf("%d %d %d %d\n",l,r,lb,rb);
//     if( l > r ) return ;
//     int mid = ( l + r ) >> 1;
//     long long nowans = -1LL, ind = lb;
//     for( int i = max( lb, mid ) ; i <=  min( mid + d -1, rb ) ; i++ ) {
//         int cos = cal( mid, i );
//         if( d - cos - 2 < 0 ) continue;
//         long long temp = query( ver[mid], ver[i-1], d - cos - 2 );
//         long long temp2 = va[mid] + ( ( i == mid ) ? 0 : va[i] );
//         //printf("%lld %lld\n",temp,temp2);
//         temp += temp2;
//         if( temp > nowans ) ind = i, nowans = temp;
//     }
//     ans = max( ans, nowans );
//     solve( l, mid - 1, lb, ind );
//     solve( mid + 1, r, ind, rb );
// }

void solve(int l, int r, int optmin, int optmax)
{
	if( l > r ) return;
 
	int mid = (l + r)/2;
 
	int optInd = optmin;
	long long optAns = -1;
 
	for(int g = optmin ; g <= optmax ; g++)
	{
		int walkDays = (s - mid) + (g - mid);
 
		if(walkDays < 0) continue;
 
		long long curAns = query(ver[mid] , ver[g] , d - walkDays);
 
		if(curAns > optAns)
		{
			optInd = g;
			optAns = curAns;
		}
	}
 
	ans = max(ans , optAns);
 
	solve(l , mid - 1 , optmin , optInd);
	solve(mid + 1 , r , optInd , optmax);
}
long long findMaxAttraction( int N, int ST, int D, int ttt[] ) {
    s = ST + 1, d = D, n = N;
    for( int i = 0 ; i < n ; i++ ) { 
        va[i+1] = ( long long )ttt[i];
        coord.emplace_back( ttt[i] );
    }
    sort( coord.begin(), coord.end() );
    ver[0] = cnt;
    build();
    for( int i = 1 ; i <= n ; i++ ) {
        ver[i] = cnt;
        update( get( va[i] ), va[i], ver[i] );
    }
    //for( int i = 0 ; i <= n ; i++ ) printf("%d ",ver[i]);
    //printf("\n");
    // for( int i = max( 1, s - d + 1 ) ; i <= min( n, s + d - 1 ) ; i++ ) ans = max( ans, va[i]);
    // solve( max( 1, s - d + 1 ), min( n, s + d - 1 ), 1, n );
    s = n - s + 1;
    solve( 1, s, s, n );
    return ans;
}

#ifdef fuck
int main()
{
    int n, va[100], st, d;
    scanf("%d %d %d",&n,&st,&d);
    for( int i = 0 ; i < n ; i++ ) scanf("%d",&va[i]);
    cout << findMaxAttraction( n, st, d, va );
}
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...