zoukankan      html  css  js  c++  java
  • BZOJ2850: 巧克力王国

    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 <= h <= 10^9,-10^9 <= a, b, x, y <= 10^9。

    k-d树模板题,据说时间复杂度为每次询问O(sqrt(N))。
    #include<cstdio>
    #include<cctype>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    #define L T[o].lc
    #define R T[o].rc
    #define rep(i,s,t) for(int i=s;i<=t;i++)
    #define dwn(i,s,t) for(int i=s;i>=t;i--)
    #define ren for(int i=first[x];i;i=next[i])
    using namespace std;
    const int BufferSize=1<<16;
    char buffer[BufferSize],*head,*tail;
    inline char Getchar() {
    	if(head==tail) {
    		int l=fread(buffer,1,BufferSize,stdin);
    		tail=(head=buffer)+l;
    	}
    	return *head++;
    }
    inline int read() {
        int x=0,f=1;char c=Getchar();
        for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
        for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
        return x*f;
    }
    typedef long long ll;
    const int maxn=50010;
    const int inf=2e9;
    int D;
    struct Node {
    	int mx[2],mn[2],x[2],lc,rc,v;
    	ll s;
    	bool operator < (const Node& ths) const {return x[D]<ths.x[D];}
    }T[maxn],x;
    void maintain(int o) {
    	T[o].s=T[L].s+T[R].s+T[o].v;
    	rep(c,0,1) {
    		T[o].mn[c]=min(min(T[L].mn[c],T[R].mn[c]),T[o].x[c]);
    		T[o].mx[c]=max(max(T[L].mx[c],T[R].mx[c]),T[o].x[c]);
    	}
    }
    void build(int& o,int l,int r,int cur) {
    	o=0;if(l>r) return;
    	int mid=l+r>>1;D=cur;nth_element(T+l,T+mid,T+r+1);
    	o=mid;build(L,l,mid-1,cur^1);build(R,mid+1,r,cur^1);
    	maintain(o);
    }
    int a,b,c;
    int in(int x,int y) {return (ll)a*x+(ll)b*y<c;}
    int check(int o) {
    	int cnt=0;
    	if(in(T[o].mn[0],T[o].mn[1])) cnt++;
    	if(in(T[o].mn[0],T[o].mx[1])) cnt++;
    	if(in(T[o].mx[0],T[o].mn[1])) cnt++;
    	if(in(T[o].mx[0],T[o].mx[1])) cnt++;
    	if(!cnt) return 0;
    	if(cnt==4) return 1;
    	return -1;
    }
    ll query(int o) {
    	if(!o) return 0;
    	int f=check(o);
    	if(!f) return 0;
    	if(f==1) return T[o].s;
    	return query(L)+query(R)+T[o].v*in(T[o].x[0],T[o].x[1]);
    }
    int n,m,rt;
    int main() {
    	T[0].mn[0]=T[0].mn[1]=inf;
    	T[0].mx[0]=T[0].mx[1]=-inf;
    	n=read();m=read();
    	rep(i,1,n) T[i].x[0]=read(),T[i].x[1]=read(),T[i].v=read();
    	build(rt,1,n,0);
    	rep(i,1,m) {
    		a=read();b=read();c=read();
    		printf("%lld
    ",query(rt));
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    remove white space from read
    optimize the access speed of django website
    dowload image from requests
    run jupyter from command
    crawl wechat page
    python version 2.7 required which was not found in the registry windows 7
    health
    alternate rows shading using conditional formatting
    word
    【JAVA基础】static 关键字
  • 原文地址:https://www.cnblogs.com/wzj-is-a-juruo/p/5578231.html
Copyright © 2011-2022 走看看