洛谷 P4475 巧克力王國 解題報告
阿新 • • 發佈:2019-02-05
max include () 重構 lld nth 大於 整數 正整數 。
P4475 巧克力王國
題目描述
巧克力王國裏的巧克力都是由牛奶和可可做成的。但是並不是每一塊巧克力都受王國人民的歡迎,因為大家都不喜歡過於甜的巧克力。
對於每一塊巧克力,我們設 \(x\) 和 \(y\) 為其牛奶和可可的含量。由於每個人對於甜的程度都有自己的評判標準,所以每個人都有兩個參數 \(a\) 和 \(b\) ,分別為他自己為牛奶和可可定義的權重, 因此牛奶和可可含量分別為 \(x\) 和 \(y\) 的巧克力對於他的甜味程度即為 \(ax+by\)。而每個人又有一個甜味限度 \(c\) ,所有甜味程度大於等於 \(c\) 的巧克力他都無法接受。每塊巧克力都有一個美味值 \(h\)
現在我們想知道對於每個人,他所能接受的巧克力的美味值之和為多少。
輸入輸出格式
輸入格式:
第一行兩個正整數 \(n\) 和 \(m\) ,分別表示巧克力個數和詢問個數。
接下來\(n\)行,每行三個整數 \(x , y , h\) ,含義如題目所示。
再接下來 \(m\) 行,每行三個整數 \(a , b , c\) ,含義如題目所示。
輸出格式:
輸出\(m\)行,其中第\(i\)行表示第\(i\)個人所能接受的巧克力的美味值之和。
說明
對於\(100\%\)的數據,\(1\le n,m\le 50000,-10^9\le a_i,b_i,x_i,y_i\le 10^9\)。
kdtree 搞一下就行了,沒有插入就不需要重構
然後復雜度是為什麽呢(
Code:
#include <cstdio> #include <algorithm> #include <cctype> #define ll long long const int N=5e4+10; const int K=2; const ll inf=1ll<<45; int read() { int x=0,f=1;char c=getchar(); while(!isdigit(c)) f=c=='-'?0:1,c=getchar(); while(isdigit(c)) x=x*10+c-'0',c=getchar(); return f?x:-x; } #define ls ch[now][0] #define rs ch[now][1] int ch[N][2],L[N][2],R[N][2],p[N][2],val[N],s[N]; ll sum[N],a,b,c; int n,m,nk,root; void ckmin(ll &mi,ll yuy){mi=mi<yuy?mi:yuy;} void ckmax(ll &mx,ll yuy){mx=mx>yuy?mx:yuy;} using std::min; using std::max; void updata(int now) { sum[now]=sum[ls]+sum[rs]+val[now]; for(int i=0;i<K;i++) { L[now][i]=R[now][i]=p[now][i]; if(ls) L[now][i]=min(L[now][i],L[ls][i]),R[now][i]=max(R[now][i],R[ls][i]); if(rs) L[now][i]=min(L[now][i],L[rs][i]),R[now][i]=max(R[now][i],R[rs][i]); } } bool cmp(int a,int b){return p[a][nk]<p[b][nk];} void build(int &now,int l,int r,int k) { if(l>r) return; int mid=l+r>>1;nk=k; std::nth_element(s+l,s+mid,s+r+1,cmp); now=s[mid]; build(ls,l,mid-1,k^1),build(rs,mid+1,r,k^1); updata(now); } void get(int now,ll &mi,ll &mx) { ll bee=a*L[now][0]+b*L[now][1]; ckmin(mi,bee),ckmax(mx,bee); bee=a*L[now][0]+b*R[now][1]; ckmin(mi,bee),ckmax(mx,bee); bee=a*R[now][0]+b*L[now][1]; ckmin(mi,bee),ckmax(mx,bee); bee=a*R[now][0]+b*R[now][1]; ckmin(mi,bee),ckmax(mx,bee); } ll query(int now) { if(!now) return 0; ll mi=inf,mx=-inf; get(now,mi,mx); if(mx<c) return sum[now]; if(mi>=c) return 0; return (a*p[now][0]+b*p[now][1]<c?val[now]:0)+query(ls)+query(rs); } int main() { n=read(),m=read(); for(int i=1;i<=n;i++) { p[i][0]=read(),p[i][1]=read(),sum[i]=val[i]=read(); s[i]=i; } build(root,1,n,0); for(int i=1;i<=m;i++) { a=read(),b=read(),c=read(); printf("%lld\n",query(root)); } return 0; }
2019.2.5
洛谷 P4475 巧克力王國 解題報告