Submission #1361949

#TimeUsernameProblemLanguageResultExecution timeMemory
1361949cowkimTeams (IOI15_teams)C++20
0 / 100
593 ms589824 KiB
#include <bits/stdc++.h>
using namespace std;
#define vi vector<int>
#define DEBUG true
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, K +M);
    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 = max(0,seg->query(0,K[i], K[i+1],n)-nrintervals);
    }
	return 1;
}
#if DEBUG
// int main(){
//     int n,q;
//     cin >> n >> q;
//     vector<int> a(n);
//     vector<int> b(n);
//     for(auto& x : a) cin >> x;
//     for(auto& x : b) cin >> x;
//     int q;
//     cin >> q;
//     return 0;
// }
#endif
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...