1. 程式人生 > >bzoj2850巧克力王國

bzoj2850巧克力王國

www rip pac get getchar 個數 現在 限制 漸進復雜度

巧克力王國

Time Limit: 60 Sec Memory Limit: 512 MB
Submit: 861 Solved: 325
[Submit][Status][Discuss]

Description

巧克力王國裏的巧克力都是由牛奶和可可做成的。但是並不是每一塊巧克力都受王國人民的歡迎,因為大家都不喜 歡過於甜的巧克力。對於每一塊巧克力,我們設x和y為其牛奶和可可的含量。由於每個人對於甜的程度都有自己的 評判標準,所以每個人都有兩個參數a和b,分別為他自己為牛奶和可可定義的權重,因此牛奶和可可含量分別為x 和y的巧克力對於他的甜味程度即為ax + by。而每個人又有一個甜味限度c,所有甜味程度大於等於c的巧克力他都 無法接受。每塊巧克力都有一個美味值h。現在我們想知道對於每個人,他所能接受的巧克力的美味值之和為多少

Input

第一行兩個正整數n和m,分別表示巧克力個數和詢問個數。接下來n行,每行三個整數x,y,h,含義如題目所示。再 接下來m行,每行三個整數a,b,c,含義如題目所示。

Output

輸出m行,其中第i行表示第i個人所能接受的巧克力的美味值之和。

Sample Input

3 3
1 2 5
3 1 4
2 2 1
2 1 6
1 3 5
1 3 7

Sample Output

5
0
4

HINT

1 <= n, m <= 50000,1 <= 10^9,-10^9 <= a, b, x, y <= 10^9。

題解:   這是一個二維平面問題,應該想到掃描線或者kdtree,   但是發現對於掃描線,無法解決問題,因為限制是ax+by,所以對於每個詢問是不一樣的。   所以是不行的,二kdtree是可以解決的,   對於暴力只能夠一個一個處理,如何一起處理是解決問題的關鍵,   所以需要kdtree。   時間復雜度,對於建樹是T(n)=f(n)+aT(n/b)=O(n)+2T(n/2)   所以得出復雜度是O(n log n)的   然後對於詢問是n^(1-1/k)是√n的,所以漸進復雜度是O(n√n)的。
 1 #include<cstring>
 2
#include<cmath> 3 #include<algorithm> 4 #include<iostream> 5 #include<cstdio> 6 7 #define ll long long 8 using namespace std; 9 inline int read() 10 { 11 int x=0,f=1;char ch=getchar(); 12 while(ch>9||ch<0){if (ch==-) f=-1;ch=getchar();} 13 while(ch<=9&&ch>=0){x=(x<<3)+(x<<1)+ch-0;ch=getchar();} 14 return x*f; 15 } 16 ll A,B,C,ans; 17 int F,n,m,rt; 18 struct Node 19 { 20 int d[2],mx[2],mn[2],v,l,r; 21 ll sum; 22 int& operator[](int x) 23 { 24 return d[x]; 25 } 26 friend bool operator<(Node x,Node y) 27 { 28 return x[F]<y[F]; 29 } 30 }p[50007]; 31 bool check(int x,int y) 32 { 33 return A*x+B*y<C; 34 } 35 int cal(Node x) 36 { 37 int tmp=0; 38 tmp+=check(x.mn[0],x.mn[1]); 39 tmp+=check(x.mx[0],x.mn[1]); 40 tmp+=check(x.mn[0],x.mx[1]); 41 tmp+=check(x.mx[0],x.mx[1]); 42 return tmp; 43 } 44 struct kd 45 { 46 Node t[50007]; 47 void update(int p) 48 { 49 int l=t[p].l,r=t[p].r; 50 for (int i=0;i<2;i++) 51 { 52 t[p].mn[i]=t[p].mx[i]=t[p][i]; 53 if (l) t[p].mn[i]=min(t[p].mn[i],t[l].mn[i]); 54 if (r) t[p].mn[i]=min(t[p].mn[i],t[r].mn[i]); 55 if (l) t[p].mx[i]=max(t[p].mx[i],t[l].mx[i]); 56 if (r) t[p].mx[i]=max(t[p].mx[i],t[r].mx[i]); 57 } 58 t[p].sum=t[p].v+t[l].sum+t[r].sum; 59 } 60 int build(int l,int r,int now) 61 { 62 F=now; 63 int mid=(l+r)>>1; 64 nth_element(p+l,p+mid,p+r+1); 65 t[mid]=p[mid]; 66 if (l<mid) t[mid].l=build(l,mid-1,now^1); 67 if (r>mid) t[mid].r=build(mid+1,r,now^1); 68 update(mid); 69 return mid; 70 } 71 void query(int p) 72 { 73 int l=t[p].l,r=t[p].r; 74 if (check(t[p][0],t[p][1]))ans+=t[p].v; 75 int tl=0,tr=0; 76 if (l) tl=cal(t[l]); 77 if (r) tr=cal(t[r]); 78 if (tl==4) ans+=t[l].sum; 79 else if (tl) query(l); 80 if (tr==4) ans+=t[r].sum; 81 else if (tr) query(r); 82 } 83 }kd; 84 int main() 85 { 86 n=read(),m=read(); 87 for (int i=1;i<=n;i++) 88 p[i][0]=read(),p[i][1]=read(),p[i].v=read(); 89 rt=kd.build(1,n,0); 90 while(m--) 91 { 92 A=read(),B=read(),C=read(); 93 ans=0; 94 kd.query(rt); 95 printf("%lld\n",ans); 96 } 97 }

bzoj2850巧克力王國