BZOJ2850 巧克力王国

来源:互联网 发布:ubuntu配置网络 编辑:程序博客网 时间:2024/04/29 05:18

题目就是让你求满足ax+by<c的点的点权和

这个……KDT可以过,不要问我为什么

以后看到不会的二维平面问题是不是都可以上KDT然后相信可以过啊-_-

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#include<iomanip>#include<vector>#include<stack>#include<queue>#include<map>#include<set>#include<bitset>using namespace std;#define MAXN 50010#define MAXM 1010#define ll long long#define INF 1000000000#define MOD 1000000007#define eps 1e-8struct pt{ll x;ll y;ll v;pt(){}pt(ll _x,ll _y,ll _v){x=_x;y=_y;v=_v;}};ll tot;ll rt;pt p[MAXN];ll son[MAXN][2];pt L[MAXN],R[MAXN],v[MAXN];ll sum[MAXN];ll n,m;ll a,b,c;bool cmpx(pt x,pt y){return x.x<y.x;}bool cmpy(pt x,pt y){return x.y<y.y;}bool (*cmp[])(pt x,pt y)={cmpx,cmpy};inline void ud(ll x){L[x]=R[x]=v[x];sum[x]=v[x].v+sum[son[x][0]]+sum[son[x][1]];if(son[x][0]){L[x].x=min(L[x].x,L[son[x][0]].x);L[x].y=min(L[x].y,L[son[x][0]].y);R[x].x=max(R[x].x,R[son[x][0]].x);R[x].y=max(R[x].y,R[son[x][0]].y);}if(son[x][1]){L[x].x=min(L[x].x,L[son[x][1]].x);L[x].y=min(L[x].y,L[son[x][1]].y);R[x].x=max(R[x].x,R[son[x][1]].x);R[x].y=max(R[x].y,R[son[x][1]].y);}}void build(ll &x,ll y,ll z,bool f){if(y>z){return ;}if(!x){x=++tot;}ll mid=y+z>>1;nth_element(p+y,p+mid,p+z+1,cmp[f]);v[x]=p[mid];build(son[x][0],y,mid-1,f^1);build(son[x][1],mid+1,z,f^1);ud(x);}bool jud(ll x,ll y){return a*x+b*y<c;}ll ask(ll x){if(!x){return 0;}if(jud(L[x].x,L[x].y)&&jud(L[x].x,R[x].y)&&jud(R[x].x,L[x].y)&&jud(R[x].x,R[x].y)){return sum[x];}if((!jud(L[x].x,L[x].y))&&(!jud(L[x].x,R[x].y))&&(!jud(R[x].x,L[x].y))&&(!jud(R[x].x,R[x].y))){return 0;}if(jud(v[x].x,v[x].y)){return v[x].v+ask(son[x][0])+ask(son[x][1]);}return ask(son[x][0])+ask(son[x][1]);}int main(){ll i,x,y,z;scanf("%lld%lld",&n,&m);for(i=1;i<=n;i++){scanf("%lld%lld%lld",&x,&y,&z);p[i]=pt(x,y,z);}build(rt,1,n,0);while(m--){scanf("%lld%lld%lld",&a,&b,&c);printf("%lld\n",ask(rt));}return 0;}/*3 31 2 53 1 42 2 12 1 61 3 51 3 7*/


0 0
原创粉丝点击