JZOJ 5390. 【NOIP2017提高A组模拟9.26】逗气
2017-09-28 21:21
381 查看
Description
Input
Output
Sample Input
3 21 8
4 5
7 9
3 1
5 2
Sample Output
65
Data Constraint
Hint
第1 个聚逗阵的逗阵之灵是第1 个第2 个聚逗阵的逗阵之灵是第3 个
Solution
先考虑选的聚集点都在当前聚逗阵左边的情况,对于第 i 个聚逗阵,且选第 j 个聚集点 比 选第 k 个聚集点,则有:bj−ci∗di+aj∗di>bk−ci∗di+ak∗di
整理可得:bj−bkaj−ak<−di
这便是斜率的形式,用单调队列维护即可。
每次在队列里二分查找斜率小于等于 −di 的第一个就是答案了。
对于选的聚集点都在当前聚逗阵右边的情况,倒过来处理即可,对于一左一右的情况已经被包含。
Code
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const int N=2e5+1; struct data { LL x,y,z; }a ,b ,c ; int pos; int q ; LL ans ; inline int read() { int X=0,w=1; char ch=0; while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();} while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar(); return X*w; } inline LL max(LL x,LL y) { return x>y?x:y; } inline bool cmp(data x,data y) { return x.x<y.x; } inline double pd(int x,int y) { return (b[x].y-b[y].y)*1.0/(b[x].x-b[y].x); } inline LL get1(data x) { int l=2,r=q[0],k=1; while(l<=r) { int mid=(l+r)>>1; if(pd(q[mid],q[mid-1])>=-x.y) l=mid+1,k=mid; else r=mid-1; } return a[b[q[k]].z].y-abs(a[b[q[k]].z].x-x.x)*x.y; } inline LL get2(data x) { int l=2,r=q[0],k=1; while(l<=r) { int mid=(l+r)>>1; if(pd(q[mid],q[mid-1])<=x.y) l=mid+1,k=mid; else r=mid-1; } return a[b[q[k]].z].y-abs(a[b[q[k]].z].x-x.x)*x.y; } int main() { int n=read(),m=read(); for(int i=1;i<=n;i++) a[a[i].z=i].x=read(),a[i].y=read(),b[i]=a[i]; for(int i=1;i<=m;i++) c[c[i].z=i].x=read(),c[i].y=read(); sort(b+1,b+1+n,cmp); sort(c+1,c+1+m,cmp); for(int i=pos=1;i<=m;i++) { while(pos<=n && c[i].x>=b[pos].x) { while(q[0]>1 && pd(pos,q[q[0]-1])>=pd(q[q[0]],q[q[0]-1])) q[0]--; q[++q[0]]=pos++; } ans[c[i].z]=max(ans[c[i].z],get1(c[i])); } q[0]=0,pos=n; for(int i=m;i;i--) { while(pos && c[i].x<=b[pos].x) { while(q[0]>1 && pd(pos,q[q[0]-1])<=pd(q[q[0]],q[q[0]-1])) q[0]--; q[++q[0]]=pos--; } ans[c[i].z]=max(ans[c[i].z],get2(c[i])); } for(int i=1;i<=m;i++) printf("%lld\n",ans[i]); return 0; }
相关文章推荐
- JZOJ5390. 【NOIP2017提高A组模拟9.26】逗气 单调队列
- JZOJ5390. 【NOIP2017提高A组模拟9.26】逗气
- [JZOJ5390]【NOIP2017提高A组模拟9.26】逗气
- 【JZOJ 5390】【NOIP2017提高A组模拟9.26】逗气
- 【jzoj5389】【NOIP2017提高A组模拟9.26】【解梦】
- [JZOJ5391]【NOIP2017提高A组模拟9.26】卡常题
- JZOJ 5389. 【NOIP2017提高A组模拟9.26】解梦
- JZOJ 5391. 【NOIP2017提高A组模拟9.26】卡常题
- JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift
- 【JZOJ 5377】【NOIP2017提高A组模拟9.19】开拓
- JZOJ 100035. 【NOIP2017提高A组模拟7.10】区间
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 4000 (Standard IO)
- 【jzoj5329】【NOIP2017提高A组模拟8.22】【时间机器】【数据结构】【扫描线】
- 【jzoj5333】【NOIP2017提高A组模拟8.23】【大新闻】【可持久化线段树】
- 【jzoj5335】【NOIP2017提高A组模拟8.24】【早苗】【矩阵乘法快速幂】
- JZOJ 5395. 【NOIP2017提高A组模拟10.6】Count
- JZOJ 5399. 【NOIP2017提高A组模拟10.7】Confess
- JZOJ 5405.【NOIP2017提高A组模拟10.10】Permutation
- 【JZOJ 5248】【NOIP2017提高A组模拟8.10】花花的聚会
- JZOJ5385. 【NOIP2017提高A组模拟9.23】Carry 树上倍增