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遞迴時,可以採用先序遍...