Submission #109466

#TimeUsernameProblemLanguageResultExecution timeMemory
109466ArturgoExamination (JOI19_examination)C++14
100 / 100
1182 ms30248 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;

int nbEleves, nbReqs;

struct Req {
  int lig, col, id;
  bool type;
  Req(int _lig = 0, int _col = 0, int _id = 0, bool _type = false) {
    lig = _lig;
    col = _col;
    id = _id;
    type = _type;
  }
};

bool operator < (const Req& a, const Req &b) {
  if(a.col == b.col)
    return a.type < b.type;
  return a.col > b.col;
}

vector<int> arbre;

void ajoute(int pos, int val) {
  pos += (1 << 18);
  while(pos != 0) {
    arbre[pos] += val;
    pos /= 2;
  }
}

int nbInter(int deb, int fin) {
  deb += (1 << 18);
  fin += (1 << 18);

  int somme = 0;
  while(deb < fin) {
    if(deb % 2 == 1) {
      somme += arbre[deb];
      deb++;
    }
    if(fin % 2 == 1) {
      fin--;
      somme += arbre[fin];
    }
    deb /= 2;
    fin /= 2;
  }

  return somme;
}
      

vector<int> nombreHautDroite(vector<Req> reqs) {
  sort(reqs.begin(), reqs.end());

  map<int, int> indexes;
  for(Req& req : reqs) {
    indexes[req.lig] = 0;
  }

  int id = 0;
  for(auto it = indexes.begin();it != indexes.end();it++) {
    it->second = id;
    id++;
  }

  for(Req& req : reqs) {
    req.lig = indexes[req.lig];
  }

  vector<int> reponses(nbReqs, 0);
  arbre = vector<int>((1 << 19), 0);

  for(Req& req : reqs) {
    if(req.type) {
      reponses[req.id] = nbInter(req.lig, (1 << 18) - 1);
    }
    else {
      ajoute(req.lig, 1);
    }
  }

  return reponses;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin >> nbEleves >> nbReqs;

  vector<Req> ajoutes, enleves, quarts;
  for(int iEleve = 0;iEleve < nbEleves;iEleve++) {
    int maths, info;
    cin >> maths >> info;
    ajoutes.push_back(Req(maths, maths + info, iEleve, false));
    enleves.push_back(Req(-info, maths + info, iEleve, false));
    quarts.push_back(Req(maths, info, iEleve, false));
  }

  for(int iReq = 0;iReq < nbReqs;iReq++) {
    int maths, info, total;
    cin >> maths >> info >> total;
    if(maths + info < total) {
      ajoutes.push_back(Req(maths, total, iReq, true));
      enleves.push_back(Req(-info + 1, total, iReq, true));
    }
    else {
      quarts.push_back(Req(maths, info, iReq, true));
    }
  }

  vector<int> positifs = nombreHautDroite(ajoutes);
  vector<int> negatifs = nombreHautDroite(enleves);
  vector<int> autres = nombreHautDroite(quarts);

  for(int iReq = 0;iReq < nbReqs;iReq++) {
    cout << autres[iReq] + positifs[iReq] - negatifs[iReq] << endl;
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...