Submission #1124632

#TimeUsernameProblemLanguageResultExecution timeMemory
1124632sleepntsheep허수아비 (JOI14_scarecrows)C11
100 / 100
2513 ms71916 KiB
#include <stdio.h>
#include <stdlib.h>

#define N 200050
#define M (1 << 24)

int n, x[N], y[N], t[N * 2], ll[N],
    A[M], L[M], R[M], ii,
    up[N],
    vv_[99], ll_[99], rr_[99], ii_;
long long ans;

void add(int *v, int l, int r, int p, int k)
{
  if (!*v) 
  {
    *v = ++ii;
    A[*v] = L[*v] = R[*v] = 0;
  }
  A[*v] += k;
  if (l == r)
    return;
  if (p <= (l + r) / 2)
    add(L + *v, l, (l + r) / 2, p, k);
  else
    add(R + *v, (l + r) / 2 + 1, r, p, k);
}
int sum(int v, int l, int r, int x, int y)
{
  if (!v || r < x || y < l)
    return 0;
  if (x <= l && r <= y)
    return A[v];
  return sum(L[v], l, (l + r) / 2, x, y) + sum(R[v], (l + r) / 2 + 1, r, x, y);
}
void generate(int v, int l, int r, int x, int y)
{
  if (!v || r < x || y < l)
    return;
  if (x <= l && r <= y)
  {
    vv_[ii_] = v;
    ll_[ii_] = l;
    rr_[ii_] = r;
    ++ii_;
    return;
  }
  generate(L[v], l, (l + r) / 2, x, y);
  generate(R[v], (l + r) / 2 + 1, r, x, y);
}
int next_(int v, int l, int r, int x, int y)
{
  if (l == r)
    return l;
  if (A[L[v]])
    return next_(L[v], l, (l + r) / 2, x, y);
  return next_(R[v], (l + r) / 2 + 1, r, x, y);
}
int next(int v, int l, int r, int x, int y)
{
  int i;
  ii_ = 0;
  generate(v, l, r, x, y);
  for (i = 0; i < ii_; ++i)
    if (A[vv_[i]])
      return next_(vv_[i], ll_[i], rr_[i], x, y);
  return r;
}

int cx(const void *i, const void *j)
{
  return x[*(int*)i] - x[*(int*)j];
}
int cy(const void *i, const void *j)
{
  return - y[*(int*)i] + y[*(int*)j];
}

void pus(int **eh, int *eo, int x)
{
  int o;
  o = eo[0]++;
  if (!o)
    eh[0] = malloc(2 * sizeof **eh);
  else if (0 == (o & (o - 1)))
    eh[0] = realloc(eh[0], o * 2 * sizeof **eh);
  eh[0][o] = x;
}

void dnc(int l, int r, int *ll, int lo)
{
  int *aa, ao, *bb, bo, *cc, co
      , i, j, m, *aa_, ao_, *bb_, bo_
      , t1, t2;

  if (!lo || l > r)
    return;

  ao = 0;
  bo = 0;
  co = 0;
  ao_ = 0;
  bo_ = 0;
  aa_ = 0;
  bb_ = 0;
  aa = 0;
  bb = 0;
  cc = 0;
  t1 = 0;
  t2 = 0;

  m = (l + r) / 2;

  for (i = 0; i < lo; ++i)
  {
    if (x[ll[i]] <= m)
    {
      pus(&aa, &ao, ll[i]);
      pus(&aa_, &ao_, ll[i]);
    }
    else if (x[ll[i]] > m)
    {
      pus(&bb, &bo, ll[i]);
      pus(&bb_, &bo_, ll[i]);
    }
  }

  for (i = ao - 1; i >= 0; --i)
  {
    up[aa[i]] = next(t1, 0, 1e9, y[aa[i]] + 1, 1e9);
    add(&t1, 0, 1e9, y[aa[i]], 1);
  }

  ii = 0;

  qsort(aa_, ao_, sizeof *aa_, cy);
  qsort(bb_, bo_, sizeof *bb_, cy);

  j = 0;
  for (i = 0; i < ao; ++i)
  {
    while (j < bo_ && y[bb_[j]] > y[aa_[i]])
    {
      while (co && x[cc[co - 1]] > x[bb_[j]])
      {
        add(&t2, 0, 1e9, y[cc[co - 1]], -1);
        --co;
      }
      pus(&cc, &co, bb_[j]);
      add(&t2, 0, 1e9, y[cc[co - 1]], 1);
      ++j;
    }

    ans += sum(t2, 0, 1e9, y[aa_[i]], up[aa_[i]]);
  }

  ii = 0;

  free(cc);
  free(aa_);
  free(bb_);

  if (l < r)
  {
    dnc(l, m, aa, ao);
    dnc(m + 1, r, bb, bo);
  }

  free(aa);
  free(bb);
}

int main()
{
  int i;
  scanf("%d", &n);

  x[n] = 2e9;
  for (i = 0; i < n; ++i)
  {
    scanf("%d%d", x + i, y + i);
    ll[i] = i;
  }
  qsort(ll, n, sizeof *ll, cx);

  dnc(0, 1e9, ll, n);

  printf("%lld", ans);
  return 0;
}

Compilation message (stderr)

scarecrows.c: In function 'main':
scarecrows.c:176:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  176 |   scanf("%d", &n);
      |   ^~~~~~~~~~~~~~~
scarecrows.c:181:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  181 |     scanf("%d%d", x + i, y + i);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...