# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1211894 | XCAC197 | Teams (IOI15_teams) | C++20 | 0 ms | 0 KiB |
//#include "teams.h"
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
int N;
pair<int,int> ivs [500000];
int cNod = 5;
//roots[i] = all the rs after l
int roots [500000];
ll val [5000000];
int lc [5000000];
int rc [5000000];
int nnod(){
cNod++;
return cNod;
}
int build(int cur, int l, int r){
if(l == r){
return cur;
}else{
lc[cur] = nnod();
rc[cur] = nnod();
build(lc[cur], l, (l+r)/2);
build(rc[cur], (l+r)/2+1, r);
return cur;
}
}
int change(int cur, int l, int r, int x){
if(l <= x && x <= r){
int ncur = nnod();
val[ncur] = val[cur]+1;
if(l != r){
lc[ncur] = change(lc[cur], l, (l+r)/2, x);
rc[ncur] = change(rc[cur], (l+r)/2+1, r, x);
}
return ncur;
}else{
return cur;
}
}
ll query(int cur, int l, int r, int fl, int fr){
if(l <= fl && fr <= r){
return val[cur];
}else if(fr < l || r < fl){
return 0;
}else{
return query(lc[cur], l, (l+r)/2, fl, fr) + query(rc[cur], (l+r)/2+1, r, fl, fr);
}
}
void init(int N_, int A_[], int B_[]) {
N = N_;
for(int i = 0; i < N; i++){
ivs[i] = make_pair(A_[i], B_[i]);
}
sort(ivs, ivs+N);
roots[0] = build(nnod(), 1, N);
int c = 0;
for(int i = 1; i <= N; i++){
int croot = roots[i-1];
while(c != N && i != ivs[c].first){
croot = change(croot, 1, N, ivs[c].second);
}
roots[i] = croot;
}
}
int can(int M, int K[]) {
sort(K, K+M);
int su = 0;
for(int i = 0; i < M; i++){
su += K[i];
}
if(su > N){
return 0;
}else{
for(int i = 0; i < M; i++){
int tot = query(roots[K[i]], 1, N, K[i], N);//counts how many intervals i slice
//some of the intervals may be sliced by previous intervals...
if(tot >= K[i]){
tot -= K[i];
}else{
break;
}
//updates
}
return 1;
}
}
int main(){
}