제출 #1361944

#제출 시각아이디문제언어결과실행 시간메모리
1361944cowkim팀들 (IOI15_teams)C++20
0 / 100
596 ms589824 KiB
#include <bits/stdc++.h>
using namespace std;
#define vi vector<int>
struct segnode{
    int nl, nr;
    int sum = 0;
    segnode * ln = nullptr;
    segnode * rn = nullptr;
    segnode(int l, int r) : nl(l),nr(r){}
    void extend(){
        if(ln != nullptr || (nl == nr)) return;
        int mid = (nl + nr)/2;
        ln = new segnode(nl, mid);
        rn = new segnode(mid +1, nr);
    }
    int update(int x, int v){
        if(x < nl || nr < x) return sum;
        if(nl == nr) return sum += v;
        extend();
        return sum = ln->update(x,v) + rn->update(x,v);
    }
    int query(int l, int r){
        if(r < nl || nr < l) return 0;
        if(l <= nl && nr <= r) return sum;
        if(ln == nullptr) return 0;
        return ln->query(l,r) + rn->query(l,r);
    }
};
struct seg2d{
    int nl, nr;
    segnode seg;
    seg2d* ln = nullptr; 
    seg2d* rn = nullptr;
    seg2d(int l, int r, int n) : nl(l),nr(r), seg(0,n){
        if(nl == nr) return;
        int mid = (nl + nr)/2;
        ln = new seg2d(nl,mid,n);
        rn = new seg2d(mid +1, nr,n);
    }
    void update(int x, int y, int v){
        if(x < nl || nr < x) return;
        seg.update(y,v);
        if(nl == nr) return;
        ln->update(x,y,v);
        rn->update(x,y,v);
    }
    int query(int low, int hi, int l, int r){
        if(hi < nl || nr < low) return 0;
        if(low <= nl && nr <= hi) return seg.query(l,r);
        return ln->query(low,hi,l,r) + rn->query(low,hi,l,r);
    }
};
#include "teams.h"
seg2d* seg;
int n;
void init(int N, int A[], int B[]) {
    n = N;
    seg = new seg2d(0,N,N);
    for(int i = 0; i< N; i++){
        seg->update(A[i],B[i],1);
    }
}

int can(int M, int K[]) {
    vector<int> k(M);
    for(int i = 0; i< M; i++){
        k[i] = K[i];
    }
    sort(k.begin(),k.end());
    int extraint = 0;
    for(int i = 0; i< M; i++){
        int nrintervals = seg->query(0,k[i],k[i],n);
        nrintervals -= extraint;
        if(K[i] > nrintervals) return 0;
        nrintervals -= K[i];
        if(i == M-1) continue;
        extraint = min(nrintervals,seg->query(0,k[i], k[i+1],n));
    }
	return 1;
}
// int main(){
//     return 0;
// }
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…