您的位置:首页 > 其它

JZOJ5390. 【NOIP2017提高A组模拟9.26】逗气 单调队列

2017-09-27 18:05 477 查看
题意:给一个数轴,有两种点,每个点都有一个坐标和权值,设第一种为ax,ay,第二种是dx,dy。那么对每一个第二种点,对于所有第一种点,求max(ay−|ax−bx|∗by),n<=2e5.

其实很套路的题目,因为单调队列的思想出了点问题= =直接套用斜率优化的那种方法就好了,不然会有问题。。

首先化简式子,由于有绝对值所以拆开,分成左右两部分搞,这个显然。

然后那个斜率式子也很好推,考试的时候就搞出来了。

具体的话就是:bj−ci∗di+aj∗di>=bk−ci∗di+ak∗di假设j决策点比k优秀,两个都在左边

然后搞搞就变成bj−bkaj−ak<=(−)di

还有两个都在右边的情况,都差不多,至于一左一右的想想就知道是可以被包含的,毕竟是max。

这个式子其实就是斜率了,然后按照这个维护递减凸壳,二分查找第一个<=(-)di,就是答案。

我一开始比较煞笔,没有意识到可以直接套斜率那个玩意儿,然后写了个萎的单调队列上去,就是每次只有当当前点比队尾优秀时才加入,这很明显错的,,因为找不到一种排序方式使得后面的元素比前面的一定优秀(就算有也会T),所以就炸了。。

经典模型,没切的我仿佛像个煞笔。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long ll;
const int N=3e5+5;
int n,m;
ll ans
;
struct node
{
ll x,y;
int id;
}a
,b
,c
;
int q
,l,r;
bool cmp1(node a,node b)
{
return a.x>b.x;
}
bool cmp2(node a,node b)
{
return a.x<b.x;
}
inline double pd(node a,node b)
{
return (double)(a.y-b.y)/(double)(a.x-b.x);
}
inline ll find(node A)
{
int l1=2,r1=r,ans=1;
while (l1<=r1)
{
int mid=(l1+r1)>>1;
if (pd(b[q[mid]],b[q[mid-1]])<=(double)A.y)ans=mid,l1=mid+1;
else r1=mid-1;
}
int x=b[q[ans]].id;
return a[x].y-abs(A.x-a[x].x)*A.y;
}
int main()
{
freopen("gas.in","r",stdin);
freopen("gas.out","w",stdout);
scanf("%d%d",&n,&m);
fo(i,1,n)scanf("%lld%lld",&a[i].x,&a[i].y),a[i].id=i;
fo(i,1,m)scanf("%lld%lld",&c[i].x,&c[i].y),c[i].id=i;
fo(i,1,n)b[i]=a[i],b[i].x=-b[i].x;
sort(b+1,b+n+1,cmp1);
sort(c+1,c+m+1,cmp2);
int x=0;
memset(ans,0,sizeof(ans));
fo(i,1,m)
{
//while (r2<n&&t1[r2+1].a<=c[i])r2++;
while (x<n&&-b[x+1].x<=c[i].x)
{
++x;
while (r>1&&pd(b[q[r]],b[q[r-1]])>=pd(b[x],b[q[r-1]]))r--;
q[++r]=x;
}
ans[c[i].id]=max(ans[c[i].id],find(c[i]));
}
r=0;
fo(i,1,n)b[i]=a[i];
sort(b+1,b+n+1,cmp1);
sort(c+1,c+1+m,cmp1);
x=0;
fo(i,1,m)
{
while (x<n&&b[x+1].x>=c[i].x)
{
++x;
while (r>1&&pd(b[q[r]],b[q[r-1]])>=pd(b[x],b[q[r-1]]))r--;
q[++r]=x;
}
ans[c[i].id]=max(ans[c[i].id],find(c[i]));
}
fo(i,1,m)printf("%lld\n",ans[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: