正题

题目链接:http://www.ybtoj.com.cn/contest/119/problem/3


题目大意

给出\(n\)个点\((x_i,y_i)\),\(m\)次给出\((k_i,a_i)\)表示标记所有满足

\[y_j>\frac{k_i}{x_j^{a_i}}
\]

的未标记点

求每个点的标记时间

\(1\leq n,m\leq 10^5,1<a_i<10\)


解题思路

全是乘法所以可以先左右取\(ln\)就是

\[ln(y_j)>ln(k_i)-ln(x_j)\times a_i
\]

把\(x,y,k\)取\(ln\)然后就是一个顺眼的式子

\[x_j\times a_i+y_i>k_i
\]

虽然原题说\((x_i,y_i)\)是点,但是我们可以换个思路,把\((x_i,y_i)\)看成边(\(f(z)=x_iz+y_i\)),\((a_i,k_i)\)看成是点,然后问在每条边下面的编号最小的点是哪个。

这个就很好解决了,考虑整体二分。每次要考虑对于一条边是否有在\([L,mid]\)编号的点在它下面。可以对于所有的\([L,mid]\)的点拿出来构成一个下凸壳,然后根据每条边的斜率二分出一个最下面的点,然后只拿这个点判断就好了。

这样就是\(O(n\log^2 n)\)的了,如果肯写归并排序和凸壳用单调队列维护是可以做到\(O(n\log n)\)的


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e5+10;
int n,m,f[N],s[N],p[N],p1[N],p2[N],top,pos[N];
double x[N],y[N],k[N],z[N];
double xj(double x1,double y1,double x2,double y2)
{return x1*y2-x2*y1;}
double xl(int a,int b,int c){
double y1=k[b]-k[a],x1=z[b]-a[z];
double y2=k[c]-k[a],x2=z[c]-z[a];
return xj(x1,y1,x2,y2);
}
bool cmp(int x,int y)
{return z[x]<z[y];}
void solve(int Ln,int Rn,int Lm,int Rm){
if(Ln>Rn)return;
if(Lm==Rm){
for(int i=Ln;i<=Rn;i++)
f[p[i]]=Lm;
return;
}
int mid=(Lm+Rm)>>1;top=0;
sort(pos+Lm,pos+1+mid,cmp);
for(int i=Lm;i<=mid;i++){
while(top>1&&xl(s[top-1],s[top],pos[i])<=0)top--;
s[++top]=pos[i];
}
sort(pos+Lm,pos+1+mid);
int cnt1=0,cnt2=0;
for(int i=Ln;i<=Rn;i++){
int l=1,r=top-1;
while(l<=r){
int m=(l+r)>>1;
if(xj(z[s[m+1]]-z[s[m]],k[s[m+1]]-k[s[m]],1,x[p[i]])>0)l=m+1;
else r=m-1;
}
if(x[p[i]]*z[s[l]]+y[p[i]]>k[s[l]])p1[++cnt1]=p[i];
else p2[++cnt2]=p[i];
}
for(int i=1;i<=cnt1;i++)p[i+Ln-1]=p1[i];
for(int i=1;i<=cnt2;i++)p[Ln+cnt1+i-1]=p2[i];
solve(Ln,Ln+cnt1-1,Lm,mid);
solve(Ln+cnt1,Rn,mid+1,Rm);
return;
}
int main()
{
freopen("analysis.in","r",stdin);
// freopen("analysis.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lf%lf",&x[i],&y[i]);
x[i]=log(x[i]);y[i]=log(y[i]);
p[i]=i;
}
for(int i=1;i<=m;i++){
scanf("%lf%lf",&k[i],&z[i]);
k[i]=log(k[i]);pos[i]=i;
}
solve(1,n,1,m);
for(int i=1;i<=n;i++)
if(f[i]==m)puts("-1");
else printf("%d\n",f[i]);
return 0;
}

YbtOJ#853-平面标记【整体二分,凸壳】的更多相关文章

  1. [BZOJ2726][SDOI2012]任务安排(DP+凸壳二分)

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1580  Solved: 466[Submit][Statu ...

  2. 【BZOJ3110】K大数查询(权值线段树套线段树+标记永久化,整体二分)

    题意:有N个位置,M个操作.操作有两种,每次操作 如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...

  3. bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型.于是就二分吧.令 \[ \begin{align*}\f ...

  4. YbtOJ#482-爬上山顶【凸壳,链表】

    正题 题目链接:https://www.ybtoj.com.cn/contest/116/problem/2 题目大意 \(n\)个点,\(x\)坐标递增,第\(i\)个点向第\(j\)个点连边. 开 ...

  5. [学习笔记] CDQ分治&整体二分

    突然诈尸.png 这两个东西好像都是离线骗分大法... 不过其实这两个东西并不是一样的... 虽然代码长得比较像 CDQ分治 基本思想 其实CDQ分治的基本思想挺简单的... 大概思路就是长这样的: ...

  6. CQD(陈丹琦)分治 & 整体二分——专题小结

    整体二分和CDQ分治 有一些问题很多时间都坑在斜率和凸壳上了么--感觉斜率和凸壳各种搞不懂-- 整体二分 整体二分的资料好像不是很多,我在网上找到了一篇不错的资料:       整体二分是个很神的东西 ...

  7. BZOJ 1901 & 整体二分

    题意: 带修改的区间第K小. SOL: 看了很久很久很久很久的整体二分,网上的各种题解也不是很多,也一直很不了解所谓的"贡献","将询问一起递归"是什么意思.. ...

  8. bzoj 3165: [Heoi2013]Segment 动态凸壳

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 202  Solved: 89[Submit][Stat ...

  9. 【BZOJ 3110】 [Zjoi2013]K大数查询(整体二分)

    [题目] Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到 ...

随机推荐

  1. .NET WebApi 实战第五讲之EntityFramework事务

    在<.NET WebApi 实战第二讲>中我们有提到过事务的概念!任何数据库的读操作可以没有事务,但是写事件必须有事务,如果一个后端工程师在数据库写入时未添加事务,那就不是一个合格的工程师 ...

  2. 四、vue前端路由(轻松入门vue)

    轻松入门vue系列 Vue前端路由 七.Vue前端路由 1. 路由的基本概念与原理 后端路由 前端路由 实现简单的前端路由 vue-router基本概念 2. vue-router的基本使用 基本使用 ...

  3. C语言定义常量

     /* #define 标识符 #define day main中day=10;仅一次赋值*/        错误 #define 标识符 常量值 #define day 10;

  4. Java从文件路径中获取文件名的几种方法

    举例:String fName =" G:\Java_Source\navigation_tigra_menu\demo1\img\lev1_arrow.gif " 方法一: 1 ...

  5. Go与接口:接口即约定

    接口 接口类型是对其他类型行为的概括与抽象.我们可以通过接口来约定某一类通用行为.Go语言的接口是隐式的:只要实现接口A的所有方法就代表实现了接口A. 接口即约定 接口是什么样的? package i ...

  6. C++、Java、Python、Linux、Go、前端、算法,慕课资料分享

    C++.Java.Python.Linux.Go.前端.算法,慕课资料分享 微信公众号:大道同行JAVA 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 又见面了.废话不多说,最近多了一些在 ...

  7. C# - 音乐小闹钟_BetaV3.0

    时间:2017-11-22 作者:byzqy 介绍: 音乐小闹钟 BetaV3.0 新鲜出炉了,快来围观吧!上效果图: 是不是觉得顿时变得高大上了许多呢?^_^ 工具/原料: (操作系统:Window ...

  8. roslaunch 启动时修改参数

    启动命令: roslaunch beginner_tutorials turtlemimic.launch arg1:=3.0 查询命令: rosparam get /param1 可以看到param ...

  9. 谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应

    面试经历 在很长的一段时间里,我以为缓存击穿和缓存穿透是一个东西,直到最近去腾讯面试,面试官问我缓存击穿和穿透的区别:我回答它俩是一样的,面试官马上抬起头用他那细长的单眼皮眼睛瞪着我说:"你 ...

  10. SQL语句之基本使用

    1.sql语法 一些重要的SQL命令: SELECT - 从数据库中提取数据 UPDATE - 更新数据库中的数据 DELETE - 从数据库中删除数据 INSERT INTO - 向数据库中插入新数 ...