MnZn 玄关求助
查看原帖
MnZn 玄关求助
1359837
Dream_Stars楼主2024/12/1 19:49

rt

# include <bits/stdc++.h>

# define int long long

using namespace std;

inline int read(){int s = 0 , w = 0;char c = getchar();while(!isdigit(c)){w |= (c == '-');c = getchar();}while(isdigit(c)){s = (s << 1) + (s << 3) + (c ^ 48);c = getchar();}return w ? -s : s;}
inline void write(int x){if(x < 0) putchar('-') , x = -x;if(x > 9) write(x / 10);putchar(x % 10 | 48);}
inline void writesp(int x){write(x) , putchar(' ');}
inline void writeln(int x){write(x) , putchar('\n');}

const int N = 2e5 + 10;
int n ,mx ,m ,ans[N];

struct node {
  int x ,y ,z ,val;
  int num;
  bool operator < (const node &b) const {
    if (x != b.x) return x < b.x;
    if (y != b.y) return y < b.y;
    return z < b.z;
  }
} a[N] ,b[N] ,p[N];

struct BIT {
  int c[N];
  void init (){memset (c ,0 ,sizeof c);}
  inline int lowbit (int x){return x & (-x);}
  inline void modify (int x ,int val){for (int i = x ;i <= mx ;i += lowbit (i)) c[i] += val;}
  inline int query (int x){int res = 0 ;for (int i = x ;i ; i -= lowbit (i)) res += c[i]; return res;}

}B;

struct Cdq {
  void cdq (int l ,int r){
    if (l == r) return ;
    int mid = ((l + r) >> 1ll);
    cdq (l ,mid) ,cdq (mid + 1, r);
    int pl = l ,pr = mid + 1;
    for (int i = l ; i <= r; i ++){
      if ((p[pl].y <= p[pr].y && pl <= mid) || (pr > r)){
        B.modify (p[pl].z, p[pl].val);
        b[i] = p[pl ++];
      } else {
        p[pr].num += B.query (p[pr].z);
        b[i] = p[pr ++];
      }
    }
    for (int i = l ; i < pl ; i ++) B.modify (p[i].z ,-p[i].val);

    for (int i = l ; i <= r; i ++) p[i] =  b[i];
  }
}C;

signed main(){
  n = read () ,mx = read ();

  for (int i = 1; i <= n ;i ++) a[i].x = read() ,a[i].y = read() ,a[i].z = read();
  
  int num = 0;

  for (int i = 1; i <= n; i ++){
    ++ num;
    if (a[i].x != a[i + 1].x || a[i].y != a[i + 1].y || a[i].z != a[i + 1].z){
      p[++ m] = a[i];
      p[m].val = num;
      num = 0;
    }
  }
  C.cdq (1 ,m);

  for (int i = 1 ;i <= m ;i ++)
    ans[p[i].num + p[i].val] += p[i].val;

  for (int i = 1 ; i <= n; i ++) writeln (ans[i]);
  return 0;
}
2024/12/1 19:49
加载中...