제출 #99627

#제출 시각아이디문제언어결과실행 시간메모리
99627andremfq팀들 (IOI15_teams)C++17
100 / 100
1808 ms141568 KiB
//codigo Yan
#include <bits/stdc++.h>

#define ff first
#define ss second
#define MAX 500010
#define OO 1000000010

using namespace std;
typedef pair<int,int> pii;

class PersistentSegTree
{
  public:

    void build(int i)
    {
      e.push_back(e[i]);
      d.push_back(d[i]);
      s.push_back(s[i]);
    }

    int update(int id, int ini, int fim, int i)
    {
      int novo = ++node_cur;

      build(id);

      if(ini == fim)
      {
        s[novo]++;
        return novo;
      }

      int m = (ini + fim)/2;

      if(i <= m)
      {
        int aux = update(e[novo] , ini , m , i);
        e[novo] = aux;
      }
      else
      {
        int aux = update(d[novo] , m + 1 , fim , i);
        d[novo] = aux;
      }

      s[novo] = s[e[novo]] + s[d[novo]];

      return novo;
    }

    int query(int id , int ini , int fim , int i, int j)
    {
      if(id == 0 || ini > j || fim < i) return 0;

      if(i <= ini && fim <= j) return s[id];

      int m = (ini + fim)/2;

      return query(e[id] , ini , m , i , j) + query(d[id] , m + 1 , fim , i , j);
    }

    int bs(int r1, int r2 , int ini , int fim , int v)
    {
      if(ini == fim) return ini;

      int b = s[e[r2]] - s[e[r1]];
      int m = (ini + fim)/2;

      if(b >= v) return bs(e[r1] , e[r2] , ini , m , v);
      return bs(d[r1] , d[r2] , m + 1 , fim , v - b);
    }

    PersistentSegTree()
    {
      e.push_back(0); e.push_back(0);
      d.push_back(0); d.push_back(0);
      s.push_back(0); s.push_back(0);
    }

  private:
    vector<int> e, d;
    vector<int> s;

    int node_cur = 1;
} SEG;

int n;
int root[MAX];

pii points[MAX];

int rectangle_sum(int x1, int x2, int y1, int y2)
{
  int s1 = SEG.query(root[x2] , 0 , n , y1 , y2);
  int s2 = SEG.query(root[x1 - 1] , 0 , n , y1 , y2);

  return s1 - s2;
}

class bars
{
  public:
    int l, r, h;
    int corner;

    bars(int ll, int rr, int hh, int cc)
    {
      l = ll;
      r = rr;
      h = hh;
      corner = cc;
    }
};

class pilha
{
  public:

    bool push(int i, int h)
    {
      bars k(i , i , h , 0);

      while(h >= p.back().h)
      {
        k.l = p.back().l;
        p.pop_back();
      }

      int s = i;

      while(!p.empty())
      {
        int ll = p.back().l;
        int lr = p.back().r;
        int lh = p.back().h;
        int lc = p.back().corner;

        int rs = rectangle_sum(lr + 1 , k.r , k.h + 1 , lh);

        if(rs > s)
        {
          int nh = SEG.bs(root[lr] , root[k.r] , 0 , n , s + rectangle_sum(lr + 1 , k.r , 0 , k.h));

          int tot = rectangle_sum(lr + 1 , k.r , k.h + 1 , nh);

          k.h = nh;
          k.l = lr + 1;
          k.corner = tot - s;

          p.push_back(k);

          return true;
        }

        k.l = ll;
        k.h = lh;
        p.pop_back();

        if(rs <= s && s <= rs + lc)
        {
          k.corner = lc - (s - rs);

          p.push_back(k);

          return true;
        }

        s -= rs + lc;
      }

      return false;
    }

    void clear()
    {
      p.clear();

      bars k(-OO , 0 , OO , 0);
      p.push_back(k);
    }

    pilha()
    {
      bars k(-OO , 0 , OO , 0);
      p.push_back(k);
    }

  private:
    vector<bars> p;
};

void init(int N, int A[], int B[])
{
  n = N;

  for(int g = 0 ; g < n ; g++) points[g].ff = A[g];
  for(int g = 0 ; g < n ; g++) points[g].ss = B[g];

  sort(points , points + n);

  int i = 0;
  root[0] = 1;

  for(int g = 1 ; g <= n ; g++)
  {
    root[g] = root[g - 1];

    while(i < n && points[i].ff == g)
    {
      int aux = SEG.update(root[g] , 0 , n , points[i].ss);
      root[g] = aux;

      i++;
    }
  }
}

int can(int M, int K[])
{
  sort(K , K + M);

  bool error = true;

  pilha s;

  for(int g = 0 ; g < M && error ; g++) error = error && s.push(K[g] , K[g] - 1);

  return (error) ? 1 : 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...