Submission #852716

#TimeUsernameProblemLanguageResultExecution timeMemory
852716tvgkHoliday (IOI14_holiday)C++17
7 / 100
34 ms9304 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define task ""
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 1e5 + 7;
 
ii tree[mxN * 4], a[mxN];
ll num, mx, tmp, ans, vt[mxN];
int j;
 
void Up(int j)
{
    tree[j].se = tree[j * 2].se + tree[j * 2 + 1].se;
 	tree[j].fi = tree[j * 2].fi + tree[j * 2 + 1].fi;
}
 
ll Get(int j, int l, int r)
{
  	if ((!tree[j].se) || (num <= 0))
        return 0;
  
    if (tree[j].se <= num)
    {
        num -= tree[j].se;
        return tree[j].fi;
    }
 
    int mid = (l + r) / 2;
    return Get(j * 2 + 1, mid + 1, r) + Get(j * 2, l, mid);
}
 
void Update(int j, int l, int r, int vt, int tt)
{
    if (l > vt || vt > r)
        return;
 
    if (l == r)
    {
      	if (tt)
          	tree[j].fi = a[l].fi;
      	else
          	tree[j].fi = 0;
      
        tree[j].se = tt;
        return;
    }
 
    int mid = (l + r) / 2;
    Update(j * 2, l, mid, vt, tt);
    Update(j * 2 + 1, mid + 1, r, vt, tt);
 
    Up(j);
}
 
long long int findMaxAttraction(int n, int stt, int day, int att[])
{
    stt++;
    for (int i = 1; i <= n; i++)
    {
        a[i].fi = att[i - 1];
        a[i].se = i;
    }
 
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; i++)
        vt[a[i].se] = i;
 
    for (int i = stt; i <= n; i++)
        Update(1, 1, n, vt[i], 1);
 
    j = n;
    for (int i = stt; i >= 1; i--)
    {
        Update(1, 1, n, vt[i], 1);
        num = day - (j - i) - min(stt - i, j - stt);
        mx = Get(1, 1, n);
 
        while (j > stt)
        {
            Update(1, 1, n, vt[j], 0);
            j--;
 
            num = day - (j - i) - min(stt - i, j - stt);
            tmp = Get(1, 1, n);
          	if (tmp == 0)
              	continue;
 
            if (tmp > mx)
                mx = tmp;
            else
            {
                j++;
                Update(1, 1, n, vt[j], 1);
                break;
            }
        }
 
        ans = max(ans, mx);
    }
 
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...