bzoj 3262 陌上花開(cdq分治)

2021-07-22 13:46:58 字數 2259 閱讀 9756

time limit: 20 sec  

memory limit: 256 mb

submit: 1431  

solved: 644 [

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分治 [

submit][

status][

discuss]

題解:cdq分治。

這道題我剛開始是想能不能把三個值搞到一塊,然後每次判斷只需要對比這個值即可,但是想了很久都沒想出來。

那要怎麼做呢?我們按照s權值從小到大排序,然後二分s權值區間[l,r],找到權值在[l,r]的區間[x,y],在二分乙個中間權值mid,利用二分查詢找到值為mid的最後乙個數的位置,因為a是從小到大有序的所以只可能是[x,posmid]對後面[posmid+1,y]產生貢獻且保證a一定滿足條件,所以我們把前面的區間中的數標記,然後按照[x,y]中的數按照c權值從小到大排序,然後按照b的順序如果有標記就向權值線段樹的a[i].m的位置加數,如果沒有標記就統計權值線段樹中[1,a[i].m]的答案然後新增到ans[a[i].num]。注意那些b,c都相等的花,要放到一起考慮,要一起都加入後再計算。

細節很多,尤其是二分查詢!!

#include#include#include#include#include#define n 200003

using namespace std;

struct data

a[n];

int n,m,tr[n*4],pd[n*4],minn,maxn,num[n];

int ans[n];

void clear(int now)

int cmp(data a,data b)

int find(int x,int l,int r)

return ans;

}void divide(int l,int r,int x,int y)

if (l>r||x>y) return;

if (l==r||x==y||f)

}else pointchange(1,1,m,a[i].c);

return ;

} int mid=(l+r)/2;

int posf=x;

int pose=y;

int posm=find(mid+1,x,y)-1;

clear(1);

for (int i=posf;i<=posm;i++) a[i].pd=1;

for (int i=posm+1;i<=pose;i++) a[i].pd=0;

sort(a+posf,a+pose+1,cmp1);

for (int i=posf;i<=pose;i++)

if (a[i].c!=a[i+1].c||a[i].b!=a[i+1].b||i==pose)

j--;}}

else

if (a[i].pd==1) pointchange(1,1,m,a[i].c);

sort(a+posf,a+pose+1,cmp);

divide(l,mid,posf,posm);

divide(mid+1,r,posm+1,pose);

}int main()

BZOJ 3262 陌上花開 CDQ

time limit 20 sec memory limit 256 mb submit 2457 solved 1098 submit status discuss 有n朵花,每朵花有三個屬性 花形 s 顏色 c 氣味 m 又三個整數表示。現要對每朵花評級,一朵花的級別是它擁有的美麗能超過的花的數...

BZOJ3262 陌上花開 CDQ分治

對第一關鍵字排序,分治每朵花,合併的時候通過歸併左右的花的第二關鍵字,將值插入樹狀陣列中求值。對於相同的花,先進行預處理即可。include bits stdc h define lowbit x x x using namespace std const int n 100005,m 200005...

BZOJ 3262 陌上花開 CDQ分治

最近又研究了一下cdq分治,發現比樹套樹好寫多了啊。首先cdq分治只能優化掉一維,對於乙個三維問題,cdq分治先二分第一維,然後通過sort第二維後由左到右掃瞄確保第二維的順序,第三維則需要乙個計數的資料結構維護,一般是樹狀陣列或者線段樹,然後就完美地解決掉了問題。而對於cdq遞迴時,可以採用先序遍...