线段树 WA 85pts 悬一关
查看原帖
线段树 WA 85pts 悬一关
965685
yyrwlj楼主2024/1/20 16:55

Code

#include <iostream>
#include <algorithm>
#define x first
#define y second
using namespace std;
const int N = 1000005;
typedef pair<int, int> PII;
PII a[N], t[N], w[N << 2];
int n;
inline void pushup(int u)
{
   w[u].x = max(w[u << 1].x, w[u << 1 | 1].x);
   w[u].y = min(w[u << 1].y, w[u << 1 | 1].y);
}
void build(int u,int l,int r)
{
   if (l == r)
   {
       w[u].x = w[u].y = t[l].y;
       return;
   }
   int mid = (l + r) >> 1;
   build(u << 1, l, mid);
   build(u << 1 | 1, mid + 1, r);
   pushup(u);
}
PII query(int u,int l,int r,int L,int R)
{
   if (L <= l && r <= R)
       return w[u];
   int mid = (l + r) >> 1;
   PII res = {-2e9, 2e9};
   if (L <= mid)
   {
       PII t = query(u << 1, l, mid, L, R);
       res.x = t.x;
       res.y = t.y;
   }
   if (mid < R)
   {
       PII t = query(u << 1 | 1, mid + 1, r, L, R);
       res.x = max(res.x, t.x);
       res.y = min(res.y, t.y);
   }
   return res;
}
int find1(int x)
{
   int l = 1, r = n, ans = n;
   while (l <= r)
   {
       int mid = (l + r) >> 1;
       if (t[mid].x > x)
           r = mid - 1, ans = mid;
       else
           l = mid + 1;
   }
   return ans;
}
int find2(int x)
{
   int l = 1, r = n, ans = 1;
   while (l <= r)
   {
       int mid = (l + r) >> 1;
       if (t[mid].x < x)
           l = mid + 1, ans = mid;
       else
           r = mid - 1;
   }
   return ans;
}
int main()
{
   scanf("%d", &n);
   if (n < 4)
   {
       while (n--)
           putchar('1');
       return 0;
   }
   int maxx = -2e9, minx = 2e9, maxy = -2e9, miny = 2e9;
   for (int i=1;i<=n;i++)
   {
       scanf("%d%d", &a[i].x, &a[i].y);
       t[i] = a[i];
       maxx = max(maxx, a[i].x);
       minx = min(minx, a[i].x);
       maxy = max(maxy, a[i].y);
       miny = min(miny, a[i].y);
   }
   sort(t + 1, t + n + 1);
   build(1, 1, n);
   for (int i=1;i<=n;i++)
   {
       if (a[i].x == maxx || a[i].x == minx || a[i].y == maxy || a[i].y == miny)
       {
           putchar('1');
           continue;
       }
       int j = find1(a[i].x), k = find2(a[i].x);
       PII res1 = query(1, 1, n, j, n);
       PII res2 = query(1, 1, n, 1, k);
       if (res1.x < a[i].y || res1.y > a[i].y || res2.x < a[i].y || res2.y > a[i].y)
           putchar('1');
       else
           putchar('0');
   }
   return 0;
}
2024/1/20 16:55
加载中...