10 pts cdq 玄关
查看原帖
10 pts cdq 玄关
750292
封禁用户楼主2024/12/10 23:54

调了两天了,要四了,可能还有些问题眼瞎没看出来,玄 2 关

#include <bits/stdc++.h>
#define int long long 
#define f(i ,m ,n ,x) for (int i = m ; i <= n ; i += x)
#define f_(i ,m ,n ,x) for (int i = m ; i >= n ; i -= x)
using cint = const int ;

template < typename T > inline void read ( T &x ) {
	x = 0 ;
	bool flag (0) ; char ch = getchar () ;
	while (! isdigit (ch))
	{ flag = ch == '-' ; ch = getchar () ;}
	while (isdigit (ch))
	{ x = (x << 1) + (x << 3) + (ch ^ 48) ; ch = getchar () ;}
	flag ? x = - x : 0 ;
} template < typename T ,typename ...Args >
inline void read ( T &x ,Args &...tmp) { read (x) ,read (tmp...) ;}

cint N = 2e5 + 7 ;
int n ,kk ,buc[N] ,same[N] ,ans[N] ;
struct point {
	int a ,b ,c ;
	bool operator < (const point &cmp) const 
	{ return a == cmp.a ? b == cmp.b ? c < cmp.c : b < cmp.b : a < cmp.a ;}
	bool operator == (const point &cmp) const 
	{ return a == cmp.a && b == cmp.b && c == cmp.c ;}
} p[N] ;
inline bool cmp (const point & ,const point &) ;
std :: multiset < point > s ;  

class BIT {
private :
	int v[N] ;
	inline int lowbit (cint x) { return x & (- x) ;}
public :
	inline void modify (cint x ,cint k) 
	{ f (i ,x ,kk ,lowbit (i)) v[i] += k ;}
	inline int query (cint x) {
		int ans = 0 ;
		f_ (i ,x ,1 ,lowbit (i)) ans += v[i] ;
		return ans ;
	} 
} bit ;

inline void cdq (cint ,cint) ;

signed main () {
	read (n ,kk) ; f (i ,1 ,n ,1) {
		int a ,b ,c ; read (a ,b ,c) ;
		p[i] = (point) {a ,b ,c} ;
		s.insert (p[i]) ;
	} int nn = n ;
	std :: stable_sort (p + 1 ,p + n + 1) ;
	n = std :: unique (p + 1 ,p + n + 1) - p - 1 ;
	f (i ,1 ,n ,1) 
		same[i] = s.count (p[i]) ;
	cdq (1 ,n) ;
	f (i ,1 ,n ,1) 
		buc[ans[i] + same[i] - 1] += same[i] ;
	f (i ,0 ,nn - 1 ,1) 
		std :: cout << buc[i] << '\n' ;
	return 0 ;
}

inline bool cmp (const point &x ,const point &y)
{ return x.b == y.b ? x.c < y.c : x.b < y.b ;} 

inline void cdq (cint l ,cint r) {
	if (l == r) return ; 
	int mid = l + r >> 1 ;
	cdq (l ,mid) ,cdq (mid + 1 ,r) ;
	int j = l ;
	f (i ,mid + 1 ,r ,1) {
		while (j <= mid && p[j].b <= p[i].b) 
		{ bit.modify (p[j].c ,same[j]) ; j ++ ;}
		ans[i] += bit.query (p[i].c) ;
	}
	f (i ,l ,j - 1 ,1) 
		bit.modify (p[i].c ,- same[i]) ;
	return (void) (std :: stable_sort (p + l ,p + r + 1 ,cmp)) ;
}
2024/12/10 23:54
加载中...