Submission #416171

#TimeUsernameProblemLanguageResultExecution timeMemory
416171Theo830마상시합 토너먼트 (IOI12_tournament)C++17
49 / 100
1064 ms3188 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll INF = 1e9+7;
ll MOD = 998244353;
typedef pair<ll,ll> ii;
#define iii pair<ll,ii>
#define f(i,a,b) for(ll i = a;i < b;i++)
#define pb push_back
#define vll vector<ll>
#define F first
#define S second
#define all(x) (x).begin(), (x).end()
///I hope I will get uprating and don't make mistakes
///I will never stop programming
///sqrt(-1) Love C++
///Please don't hack me
///@TheofanisOrfanou Theo830
///Think different approaches (bs,dp,greedy,graphs,shortest paths,mst)
///Stay Calm
///Look for special cases
///Beware of overflow and array bounds
///Think the problem backwards
///Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2)
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
uniform_int_distribution<ll> distr;
ll rnd(ll a, ll b){return distr(rng)%(b-a+1)+a;}
/*
#define inbuf_len 1 << 16
#define outbuf_len 1 << 16

int GetBestPosition(int N, int C, int R, int *K, int *S, int *E);

int main() {
  int tmp;
  char *inbuf, *outbuf;
  inbuf = (char*) malloc(inbuf_len * sizeof(char));
  outbuf = (char*) malloc(outbuf_len * sizeof(char));
  tmp = setvbuf(stdin, inbuf, _IOFBF, inbuf_len);
  assert(tmp == 0);
  tmp = setvbuf(stdout, outbuf, _IOFBF, outbuf_len);
  assert(tmp == 0);

  int N, C, R;
  int *K, *S, *E;
  tmp = scanf("%d %d %d", &N, &C, &R);
  assert(tmp == 3);
  K = (int*) malloc((N-1) * sizeof(int));
  S = (int*) malloc(C * sizeof(int));
  E = (int*) malloc(C * sizeof(int));
  int i;
  for (i = 0; i < N-1; i++) {
    tmp = scanf("%d", &K[i]);
    assert(tmp == 1);
  }
  for (i = 0; i < C; i++) {
    tmp = scanf("%d %d", &S[i], &E[i]);
    assert(tmp == 2);
  }

  printf("%d\n", GetBestPosition(N, C, R, K, S, E));

  return 0;

}
*/
ll pre[100005] = {0};
ll sum(ll l,ll r){
    return pre[r+1] - pre[l];
}
struct node{
    ll sum = 0,lazy = 0;
};
node seg[400005];
void build(ll s,ll e,ll idx){
    if(s == e){
        seg[idx].sum = 1;
        return;
    }
    ll mid = (s+e)/2;
    build(s,mid,idx*2);
    build(mid+1,e,idx*2+1);
    seg[idx].sum = seg[idx*2].sum + seg[idx*2+1].sum;
}
void update(ll s,ll e,ll qs,ll qe,ll idx){
    if(qs <= s && e <= qe){
        seg[idx].lazy = 1;
        seg[idx].sum = 0;
        return;
    }
    else if(s > qe || e < qs){
        return;
    }
    if(seg[idx].lazy == 1){
        seg[idx].lazy = 0;
        seg[idx*2].sum = seg[idx*2+1].sum = 0;
        seg[idx*2].lazy = seg[idx*2+1].lazy = 1;
    }
    ll mid = (s+e)/2;
    update(s,mid,qs,qe,idx*2);
    update(mid+1,e,qs,qe,idx*2+1);
    seg[idx].sum = seg[idx*2].sum + seg[idx*2+1].sum;
}
ll query(ll s,ll e,ll k,ll idx){
    if(s == e){
        return s-1;
    }
    if(seg[idx].lazy == 1){
        seg[idx].lazy = 0;
        seg[idx*2].sum = seg[idx*2+1].sum = 0;
        seg[idx*2].lazy = seg[idx*2+1].lazy = 1;
    }
    ll mid = (s+e)/2;
    if(seg[idx*2].sum >= k){
        return query(s,mid,k,idx*2);
    }
    else{
        return query(mid+1,e,k - seg[idx*2].sum,idx*2+1);
    }
}
int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {
    ll posa = 0;
    ll ans = 0;
    f(i,0,N-1){
        pre[i+1] = pre[i] + (K[i] > R);
    }
    ll n = N+1;
    build(1,n,1);
    f(i,0,C){
        S[i] = query(1,n,S[i]+1,1);
        E[i] = query(1,n,E[i]+2,1) - 1;
        update(1,n,S[i]+2,E[i]+1,1);
    }
    f(i,0,n){
        ll res = 0;
        f(j,0,C){
            if(S[j] <= i && i <= E[j]){
                res += sum(S[j],E[j]-1) == 0;
            }
        }
        if(res > posa){
            posa = res;
            ans = i;
        }
    }
    return ans;
}
/*
5 3 3
1
0
2
4
1 3
0 1
0 1
*/

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...