bzoj 3262 陌上花開

2021-07-31 14:31:40 字數 1924 閱讀 4043



time limit: 20 sec  

memory limit: 256 mb

submit: 2142  

solved: 956 [

submit][

status][

discuss]

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

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

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

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

10 3

3 3 3

2 3 3

2 3 1

3 1 1

3 1 2

1 3 1

1 1 2

1 2 2

1 3 2

1 2 131

3010

1001

1 <= n <= 100,000, 1 <= k <= 200,000

樹套樹 cdq分治

【分析】

怎麼說呢,對cdq分治還是半懂不懂...(智商感人qwqqq)

對於三個屬性,y排序,x做cdq分治,z做樹狀陣列處理。

具體實現中,我們在處理[l,r]時,把整個區間掃一遍,然後把x<=mid的放在左邊,否則放在右邊,由於y已經排好序,所以左邊區間y依舊單增,右邊也是。

所以對於右邊的每乙個花,考慮左半邊的貢獻,就要用乙個指標線性掃瞄一下,如果左邊指標l1對應的y<=右邊指標l2對應的y,那麼可以把l1.z加入樹狀陣列中統計方案。

注意tim陣列,由於樹狀陣列要儲存很多次分治資訊,一直memset很慢,所以對每次分治打乙個標記來清除樹狀陣列中的資訊。

不得不說好神啊qwqqq

【**】

//bzoj 3262 陌上花開

#include#include#include#include#define ll long long

#define m(a) memset(a,0,sizeof a)

#define fo(i,j,k) for(i=j;i<=k;i++)

using namespace std;

const int mxn=200005;

int n,m,t,tot;

int c[mxn],ans[mxn],tim[mxn];

struct node

a[mxn],tmp[mxn];

inline bool operator < (node x,node y)

inline void cdq(int l,int r)

int l1=l,l2=mid+1;

fo(i,l,r)

memcpy(a+l,tmp+l,sizeof(a[0])*(r-l+1));

j=l,t++;

fo(i,mid+1,r)

cdq(l,mid),cdq(mid+1,r);

}int main()

{ int i,j;

scanf("%d%d",&n,&m);

fo(i,1,n)

scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z),a[i].cnt=1;

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

fo(i,1,n)

{if(i==1 || a[i-1]

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 樹狀陣列 秒掉,...