제출 #1237862

#제출 시각아이디문제언어결과실행 시간메모리
1237862caacrugon마상시합 토너먼트 (IOI12_tournament)C++20
100 / 100
47 ms5312 KiB
#include <bits/stdc++.h>
using namespace std;

vector<int> tree(100010*4,0);

void build(int n, int l, int r){
  if(l==r){
    tree[n]=1;
    return;
  }
  int m=l+((r-l)/2);
  build(n*2,l,m);
  build(n*2+1,m+1,r);
  tree[n]=tree[n*2]+tree[n*2+1];
  return;
}

void update(int n, int ql, int qr, int l, int r){
  if(ql>r || qr<l) return; 
  if(ql<=l && r<=qr){
    tree[n]=0;
    return;
  }
  int m=l+((r-l)/2);
  update(n*2,ql,qr,l,m);
  update(n*2+1,ql,qr,m+1,r);
  tree[n]=tree[n*2]+tree[n*2+1];
}

int query(int n, int l, int r, int x, int i){
  if(l==r)return l;
  int m=l+((r-l)/2);
  if(tree[2*n]+i>=x)return query(n*2,l,m,x,i);
  else{
    i+=tree[n*2];
    return query(n*2+1,m+1,r,x,i);
  }
}

int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {
  int ans=0;
  vector<int> pMax(N+5,0),tmp(N+5,0),tmp2(N+5,0);
  vector<pair<int,int>> ln;
  int wins=0;
  for(int i=0;i<N-1;i++){
    if(K[i]>R){
      tmp[i+1]++;
      tmp2[i]++;
      wins++;
    }
  }
  for(int i=0;i<N;i++){
    tmp[i+1]+=tmp[i];
    tmp2[N-1-i]+=tmp2[N-i];
    ln.push_back({i,i});
  }
  build(1,0, N);
  for(int i=0;i<C;i++){
    int l=query(1,0,N,S[i]+1,0);
    int r=query(1,0,N,E[i]+2,0)-1;
    update(1,l+1,r,0,N);
    if(tmp[l]+tmp2[r]==wins){
      pMax[l]++;
      pMax[r+1]--;
    }
  }
  int mx=pMax[0],bestWins=pMax[0];
  for(int i=1;i<=N;i++){
    mx+=pMax[i];
    if(mx>bestWins){
      bestWins=mx;
      ans=i;
    }
  }
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...