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;
    }
    

      

  • 相关阅读:
    SQLite基础-7.子句(一)
    SQLite基础-8.子句(二)
    SQLite基础-6.运算符
    SQLite基础-5.数据操作语言
    SQLite基础-4.数据定义语言(DDL)
    SQLite基础-3.语法与数据类型
    IDEA操作之FileHeager设置
    IDEA操作之test case coverage的方法
    IDEA插件之JavaDoc
    IDEA插件之JProfiler
  • 原文地址:https://www.cnblogs.com/wzj-is-a-juruo/p/5578231.html
Copyright © 2011-2022 走看看