time limit: 20 sec
memory limit: 256 mb
submit: 2493
solved: 1113 [
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分治模板。
唯一的不同是這道題的第三維並不是1到n的全排列,我們可以離散化一發,使得其為全排列,這樣便於在
cdq分治時找到中點並進行分治,還有乙個地方就是屬性相同時求數量時按照題目要求即可。。。
#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define ll __int64
#define inf 1000000000
#define mod 1000000007
#define maxn 800100
#define lowbit(x) (x&-x)
#define eps 1e-9
struct node
}a[maxn],q[maxn];
int ans[maxn],n,k,c[maxn];
void update(int x,int val)
}int query(int x)
return res;
}bool comp(node a,node b)
void cdq(int l,int r)
for(i=l;i<=r;i++)
if(a[i].z<=m)
update(a[i].y,-a[i].sum);
ls=l;rs=m+1;
for(i=l;i<=r;i++)
for(i=l;i<=r;i++)
a[i]=q[i];
cdq(l,m);cdq(m+1,r);
}int main(void)
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
a[++cnt]=a[i];
} sort(a+1,a+cnt+1,comp);
for(i=1;i<=cnt;i++)//將第三維離散化,變成1到cnt的全排列
a[i].z=i;
sort(a+1,a+cnt+1);
cdq(1,cnt);
for(i=1;i<=cnt;i++)
for(i=0;i<=n-1;i++)
printf("%d\n",ans[i]);
return 0;
}
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分治)
time limit 20 sec memory limit 256 mb submit 1431 solved 644 submit status discuss 有n朵花,每朵花有三個屬性 花形 s 顏色 c 氣味 m 又三個整數表示。現要對每朵花評級,一朵花的級別是它擁有的美麗能超過的花的數量...