HYSBZ 3262 陌上花開 (CDQ分治)

2021-09-26 20:48:04 字數 1584 閱讀 2598

有n朵花,每朵花有三個屬性:花形(s)、顏色(c)、氣味(m),用三個整數表示。

現在要對每朵花評級,一朵花的級別是它擁有的美麗能超過的花的數量。

定義一朵花a比另一朵花b要美麗,當且僅sa>=sb,ca>=cb,ma>=mb。

顯然,兩朵花可能有同樣的屬性。需要統計出評出每個等級的花的數量。

input

第一行為n,k (1 <= n <= 100,000, 1 <= k <= 200,000 ), 分別表示花的數量和最大屬性值。

以下n行,每行三個整數xi, yi, zi (1 <= si, ci, mi <= k),表示第i朵花的屬性

output

包含n行,分別表示評級為0...n-1的每級花的數量。

解析:cdq分治,先對x從小到大排序,再對y從小到大排序,再對z從小到大排序

一維排序,二維分治,第三維樹狀陣列

注意去重,

#include #define ll long long

using namespace std;

const int maxn = 3e5 + 30;

struct nodea[maxn], q[maxn], tmp[maxn];

int num[maxn], book[maxn], sum[maxn];

int ans[maxn];

bool cmp(node x, node y)

int lowbit(int x)

void add(int x, int val)

}void del(int x)

}int query(int x)

return ans;

}void cdq(int l, int r)

int mid = l + r >> 1;

cdq(l, mid);

cdq(mid, r);

int t1 = l, t2 = mid, cnt = 0;

while(t1 < mid && t2 < r)

else

}while(t1 < mid)

while(t2 < r)

for(int i = 0; i < cnt; i++)

}int main()

sort(a + 1, a + n + 1, cmp);

book[0] = num[0] = ans[0] = 0;

int len = 0;

for(int i = 1; i <= n; i++)

book[i] = 1;

q[len].id = i;

q[len].x = a[i].x;

q[len].y = a[i].y;

q[len].z = a[i].z;

q[len].val = 1;

len++;

}cdq(0, len);

for(int i = 1; i <= n; i++) num[ans[i]]+=book[i];

for(int i = 0; i < n; i++) printf("%d\n", num[i]);

return 0;

}

BZOJ3262 陌上花開

description 有n朵花,每朵花有三個屬性 花形 s 顏色 c 氣味 m 又三個整數表示。現要對每朵花評級,一朵花的級別是它擁有的美麗能超過的花的數量。定義一朵花a比另一朵花b要美麗,當且僅當sa sb,ca cb,ma mb。顯然,兩朵花可能有同樣的屬性。需要統計出評出每個等級的花的數量。...

BZOJ3262 陌上花開

description 有n朵花,每朵花有三個屬性 花形 s 顏色 c 氣味 m 又三個整數表示。現要對每朵花評級,一朵花的級別是它擁有的美麗能超過的花的數量。定義一朵花a比另一朵花b要美麗,當且僅當sa sb,ca cb,ma mb。顯然,兩朵花可能有同樣的屬性。需要統計出評出每個等級的花的數量。...

BZOJ 3262 陌上花開

話說這是一道許可權題,如果我複製過來,bzoj不會打死我吧?hhh 大意就是給三維空間中的很多點,乙個點p x,y,z 的級別定義為x0 x y0 y z0 z的任意點p0 x0,y0,z0 的數量,求每種級別的點各有多少種。看過一道二維的這樣的題目,當時想的是直接排序然後用bit 樹狀陣列 秒掉,...