您的位置:首页 > 其它

JZOJ 5390. 【NOIP2017提高A组模拟9.26】逗气

2017-09-28 21:21 381 查看

Description



Input



Output



Sample Input

3 2

1 8

4 5

7 9

3 1

5 2

Sample Output

6

5

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: