Submission #727333

#TimeUsernameProblemLanguageResultExecution timeMemory
727333TheSahibTeams (IOI15_teams)C++17
100 / 100
2941 ms145128 KiB
#include "teams.h"
#include <bits/stdc++.h>

#define ll long long
#define pii pair<int, int>

using namespace std;

const int MAX = 5e5 + 5;
const int TREE_SIZE = MAX * 20;

int n;
//vector<pii> v;

int tree[TREE_SIZE], L[TREE_SIZE], R[TREE_SIZE];
int nxt = 0;
int roots[MAX];

void build(int node, int l, int r){
    if(l == r) return;
    int mid = (l + r) / 2;

    L[node] = ++nxt;
    R[node] = ++nxt;
    build(L[node], l, mid);
    build(R[node], mid + 1, r);
}

int update(int node, int l, int r, int pos){
    int id = ++nxt;
    tree[id] = tree[node] + 1;
    if(l == r) return id;
    
    L[id] = L[node];
    R[id] = R[node];

    int mid = (l + r) >> 1;
    if(pos <= mid){
        L[id] = update(L[id], l, mid, pos);
    }
    else{
        R[id] = update(R[id], mid + 1, r, pos);
    }
    return id;
}

int ask(int node, int l, int r, int ql, int qr){
    if(ql > r || qr < l){
        return 0;
    }
    if(ql <= l && r <= qr){
        return tree[node];
    }
    int mid = (l + r) >> 1;
    return ask(L[node], l, mid, ql, qr) + ask(R[node], mid + 1, r, ql, qr);
}

void init(int N, int A[], int B[])
{
    n = N;
    vector<int> a[n + 1];
    for (int i = 0; i < n; i++)
    {
        //v.push_back({A[i], B[i]});
        a[A[i]].push_back(B[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        roots[i] = roots[i - 1];
        for(int r:a[i]){
            roots[i] = update(roots[i], 1, MAX, r);
        }
    }
}


int can(int M, int K[])
{
    sort(K, K + M);
    int s = 0;
    vector<pii> v;
    for (int i = 0; i < M; i++)
    {
        if(!v.empty() && v[v.size() - 1].first == K[i]){
            v[v.size() - 1].second += K[i];
        }
        else{
            v.push_back({K[i], K[i]});
        }
        s += K[i];
    }
    if(s > n) return false;
    vector<pii> blocks;
    for (int i = 0; i < v.size(); i++)
    {
        if(!blocks.empty()){
            blocks[blocks.size() - 1].second = v[i].first - 1;
        }
        blocks.push_back({v[i].first, 0});
    }
    blocks[blocks.size() - 1].second = n;

    vector<int> used;
    used.resize(blocks.size(), 0);

    for (int i = 0; i < v.size(); i++)
    {
        int need = v[i].second;
        for (int j = i; j < blocks.size(); j++)
        {
            int c = min(ask(roots[v[i].first], 1, MAX, blocks[j].first, blocks[j].second) - used[j], need);
            used[j] += c;
            need -= c;
            if(need == 0) break;
        }
        if(need != 0) return false;
    }
    return true;
}

Compilation message (stderr)

teams.cpp: In function 'int can(int, int*)':
teams.cpp:94:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |     for (int i = 0; i < v.size(); i++)
      |                     ~~^~~~~~~~~~
teams.cpp:106:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |     for (int i = 0; i < v.size(); i++)
      |                     ~~^~~~~~~~~~
teams.cpp:109:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |         for (int j = i; j < blocks.size(); j++)
      |                         ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...