蛙声一片
查看原帖
蛙声一片
557728
dingding2008楼主2023/6/12 14:05
#include <bits/stdc++.h>
#define Node pair <int, int>
#define mp(x, y) make_pair(x, y)
using namespace std;
inline int read()
{
  char ch = getchar();
  int res = 0, f = 1;
  for (; ch < '0' || ch > '9'; ch = getchar())
  {
    if (ch == '-')
    {
      f = -1;
    }
  }
  for (; ch >= '0' && ch <= '9'; ch = getchar())
  {
    res = (res << 3) + (res << 1) + (ch - '0');
  }
  return res * f;
}
const int N = (int) 1e6 + 10;
const int inf = (int) 1e9;
int t, n, a[N];
Node q1[N], q2[N];
int l1, r1, l2, r2;
inline Node mx()
{
  if (r1 == l1)
  {
    return q2[l2++];
  }
  else if (r2 == l2)
  {
    return q1[--r1];
  }
  else if (q2[l2] > q1[r1 - 1])
  {
    return q2[l2++];
  }
  else
  {
    return q1[--r1];
  }
}
inline Node mn()
{
  if (l1 == r1)
  {
    return q2[--r2];
  }
  else if (r2 == l2)
  {
    return q1[l1++];
  }
  else if (q2[r2 - 1] < q1[l1])
  {
    return q2[--r2];
  }
  else
  {
    return q1[l1++];
  }
}
inline Node M_min(Node x, Node y)
{
  return x < y ? x : y;
}
inline void solve()
{
  l1 = r1 = l2 = r2 = 0;
  for (int i = 1; i <= n; ++i)
  {
    q1[r1] = mp(a[i], i);
  }
  int fl = 0, cnt = 0, alf = 0;
  while (true)
  {
    cnt++;
    Node x = mn(), y = mx();
    Node z = M_min((l1 < r1 ? q1[l1] : mp(inf, -inf)), (l2 < r2 ? q2[r2 - 1] : mp(inf, -inf)));
    y.first -= x.first;
    if (y > z || cnt == n - 1)
    {
      if (fl)
      {
        printf("%d\n", n - (fl - (alf & 1)));
        return;
      }
      if (cnt == n - 1)
      {
        printf("1\n");
        return;
      }
      q2[r2++] = y;
    }
    else
    {
      alf++;
      if (!fl)
      {
        fl = cnt;
      }
      q2[r2++] = y;
    }
  }
}
int main()
{
  t = read() - 1;
  n = read();
  for (int i = 1; i <= n; ++i)
  {
    a[i] = read();
  }
  solve();
  while (t--)
  {
    int k = read();
    for (int i = 1, x; i <= k; ++i)
    {
      x = read(), a[x] = read();
    }
    solve();
  }
  return 0;
}

四年级蒟蒻中的蒟蒻中的蒟蒻中的蒟蒻求助!!!

2023/6/12 14:05
加载中...