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),所以就炸了。。
经典模型,没切的我仿佛像个煞笔。
其实很套路的题目,因为单调队列的思想出了点问题= =直接套用斜率优化的那种方法就好了,不然会有问题。。
首先化简式子,由于有绝对值所以拆开,分成左右两部分搞,这个显然。
然后那个斜率式子也很好推,考试的时候就搞出来了。
具体的话就是: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]); }
相关文章推荐
- 【jzoj5368】【NOIP2017提高A组模拟9.16】【为逝去的公主献上的七重樱】【单调队列】
- [JZOJ5390]【NOIP2017提高A组模拟9.26】逗气
- JZOJ5390. 【NOIP2017提高A组模拟9.26】逗气
- 【JZOJ 5390】【NOIP2017提高A组模拟9.26】逗气
- JZOJ 5390. 【NOIP2017提高A组模拟9.26】逗气
- 【jzoj5389】【NOIP2017提高A组模拟9.26】【解梦】
- JZOJ 5391. 【NOIP2017提高A组模拟9.26】卡常题
- [JZOJ5391]【NOIP2017提高A组模拟9.26】卡常题
- JZOJ 5389. 【NOIP2017提高A组模拟9.26】解梦
- 5368. 【NOIP2017提高A组模拟9.16】为逝去的公主献上的七重樱 单调队列
- JZOJ 100045. 【NOIP2017提高A组模拟7.13】好数
- JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph
- 【JZOJ 5405】【NOIP2017提高A组模拟10.10】Permutation
- [jzoj]3499. 【NOIP2013模拟联考15】人类基因组(genes) (单调队列、前缀和、线段树解一题)
- JZOJ5358. 【NOIP2017提高A组模拟9.12】BBQ
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 4000 (Standard IO)
- jzoj5402 【NOIP2017提高A组模拟10.8】God Knows
- JZOJ5379. 【NOIP2017提高A组模拟9.21】Victor爱数字
- JZOJ 5183. 【NOIP2017提高组模拟6.29】小T的钢琴
- 【JZOJ 4933】【NOIP2017提高组模拟12.24】C