题目大意:给你平面上n个横坐标严格递增的点,对于每个i∈[1,n)i∈[1,n)i\in[1,n),求一个jjj,满足Pj" style="position: relative;" tabindex="0" id="MathJax-Element-527-Frame" class="MathJax">PjPjP_j严格在直线PiPi+1PiPi+1P_iP_{i+1}上方。点坐标10910910^9,有10510510^5个点。
题解:答案可能不在凸包上,但如果凸包上都没有解那么就不可能有解。因此可以判断是否有解,扩展下去,可以先二分答案,然后看区间凸包是否有解;区间可以用线段树维护,判定凸包是否有解可以三分(凸包上的点到射线的距离);然后二分答案可以放到线段树上去,这样就两个log了。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define lint long long
#define gc getchar()
#define N 100010
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
inline int inn()
{int x,ch;while((ch=gc)<'0'||ch>'9');x=ch^'0';while((ch=gc)>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0');return x;
}
int ans[N];
struct P{int x,y;P(int _x=0,int _y=0) { x=_x,y=_y; }inline int init() { return x=inn(),y=inn(),0; }inline P operator=(const P &p) { return x=p.x,y=p.y,*this; }inline P operator-(const P &p)const { return P(x-p.x,y-p.y); }inline int show() { cerr<<"("<<x<<","<<y<<")"<<endl;return 0; }
}p[N];
inline lint cross(const P &a,const P &b) { return (lint)a.x*b.y-(lint)a.y*b.x; }
inline lint cross(const P &a,const P &b,const P &c) { return cross(b-a,c-a); }
inline int Add_front(vector<P> &ps,const P &p)
{int t=(int)ps.size();while(t>1&&cross(p,ps[t-1],ps[t-2])>0) t--;ps.resize(t+1),ps[t]=p;return 0;
}
inline int exist(const vector<P> &ps,const P &s,const P &t)
{int l=0,r=(int)ps.size()-1,a=l+(r-l)/3,b=a+(r-l)/3;for(;r-l>=3;a=l+(r-l)/3,b=a+(r-l)/3)if(cross(s,t,ps[a])<cross(s,t,ps[b])) l=a;else r=b;for(int i=l;i<=r;i++) if(cross(s,t,ps[i])>0) return 1;return 0;
}
struct segment{int l,r;vector<P> ps;segment *ch[2];
}*rt;
int build(segment* &rt,int l,int r)
{rt=new segment,rt->l=l,rt->r=r;if(l==r) return 0;int mid=(l+r)>>1;build(rt->ch[0],l,mid),build(rt->ch[1],mid+1,r);return 0;
}
int update(segment* &rt,int x)
{int l=rt->l,r=rt->r,mid=(l+r)>>1;Add_front(rt->ps,p[x]);if(l==r) return 0;update(rt->ch[x>mid],x);return 0;
}
int query(segment* &rt,const P &s,const P &t)
{int l=rt->l,r=rt->r;if(l==r) return exist(rt->ps,s,t)?l:0;if(exist(rt->ch[0]->ps,s,t))return query(rt->ch[0],s,t);return query(rt->ch[1],s,t);
}
inline int show(segment* &rt)
{int l=rt->l,r=rt->r;debug(l)sp,debug(r)ln;for(int i=0;i<(int)rt->ps.size();i++) rt->ps[i].show();cerr ln;if(l==r) return 0;show(rt->ch[0]),show(rt->ch[1]);return 0;
}
int main()
{int n=inn();for(int i=1;i<=n;i++) p[i].init();build(rt,1,n),update(rt,n);for(int i=n-2;i;i--)ans[i]=query(rt,p[i],p[i+1])-1,update(rt,i+1);for(int i=1;i<n;i++) printf("%d ",max(ans[i],0));return !printf("\n");
}

CERC 2014 B Mountainous landscape - 线段树 - 凸包 - 三分相关推荐

  1. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP

    题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...

  2. bzoj5077: [Ctsc2016]时空旅行【线段树+凸包】

    Description 2045年,人类的技术突飞猛进,已经找到了进行时空旅行的方法.小R得到了一台时空旅行仪,他想用它调查不同 时空中人类的发展状况.根据平行时空理论,宇宙中存在着很多独立的时空,每 ...

  3. 【uoj】198:【CTSC2016】时空旅行-dfs序线段树凸包

    传送门:uoj198 题解 y,z坐标无用. 先化简一下式子,假设选择的是第iii个星球,其x" role="presentation" style="posi ...

  4. [CTSC2016]时空旅行(线段树+凸包)

    应该是比较套路的,但是要A掉仍然不容易. 下面理一下思路,思路清楚了也就不难写出来了. 0.显然y,z坐标是搞笑的,忽略即可. 1.如果x不变,那么直接set即可解决. 2.考虑一个空间和询问x0,通 ...

  5. BZOJ5077: [Ctsc2016]时空旅行(线段树+凸包)

    传送门 题解: 首先答案为min(x−xi)2+cimin(x−xi)2+ci\min {(x-x_i)^2+c_i},移项得x2−2xix+x2i+cx2−2xix+xi2+cx^2 -2x_ix+ ...

  6. 线段树(单点更新(模板)) 之 hdu 1166

    // [7/24/2014 Sjm] /* 第一道用线段树做的题,照着大神的代码风格写的,,就当作线段树单点更新的模板吧....(当年用树状数组做的:代码见这里) */ 1 #include < ...

  7. 【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行)

    文章目录 前言 李超树 引入(斜率优化) 什么是李超树? 李超树活着能干点什么? 算法思想(使用手册?) 插入 查询 模板 判断是否覆盖(优不优) 插入 查询 例题 板题:BlueMary开公司 分析 ...

  8. YBTOJ:向量问题(线段树分治、凸包)

    文章目录 题目描述 数据范围 解析 代码 题目描述 你要维护一个向量集合,支持以下操作: 插入一个向量 . 删除插入的第 x 个向量. 查询当前集合与(x,y)(x,y)(x,y) 点积的最大值是多少 ...

  9. 【YBT2023寒假Day3 C】樱桃莓莓(凸包)(线段树)

    樱桃莓莓 题目链接:YBT2023寒假Day3 C 题目大意 给你一棵有根数,点有 a,b 两种权值. 然后一个点的分数是它以及它所有祖先的 a 权值和的绝对值乘上 b 权值和的绝对值. 然后有两种操 ...

  10. 斜率优化之凸包优化与李超线段树

    文章目录 前言 凸包优化 第一步 第二步 最后一步 例一 转移方程 凸包优化 代码 例二 题目大意 转移方程 凸包优化 代码 李超线段树 思想 插入 查询 代码 例三 代码 例四 转移方程 怎么做 代 ...

最新文章

  1. filter-mapping中的dispatcher使用
  2. J2EE Java泛型的好处
  3. 链接和作用域2 - C++快速入门43
  4. Entity Framework-02
  5. Android项目笔记整理(1)
  6. 34.任务计划cron chkconfig systemctl管理服务 unit target
  7. 在div中设置文字与内部div垂直居中
  8. 工业智能相机与基于PC的机器视觉的区别比较
  9. MFC中COMBO BOX的设置
  10. svn st 的状态说明
  11. 详解Visual Studio 2010中ASP.NET新增23项功能 转
  12. ps使用抽出滤镜抠头发
  13. DVBS卫星识别流程
  14. mac安装win7之后鼠标失灵_2013款mac air及一体机安装win7 键盘鼠标失灵的解决方法...
  15. LeetCode刷题攻略
  16. 如何查看一个人发表的SCI数量
  17. 朋友之间最舒服的关系
  18. 苏锡常镇一模数学试卷含官方答案
  19. 常用数字与字母的正则表达式(转载)
  20. case语句使用举例

热门文章

  1. Pure Strategy Game
  2. 怎样用计算机画图合成图片,如何用电脑自带画图软件将多张截图拼成一张图,自动生成的那种...
  3. 拓展显示器分辨率模糊(亲测,超级有用)
  4. 如何在InfoPath2007中接受URL参数
  5. Android平台音视频RTMP推送|GB28181对接之动态水印设计
  6. Hulu机器学习问题与解答系列 | 二十九:WGANs:抓住低维的幽灵
  7. 用友u8系统管理服务器,用友U8服务软件建立新账套的教程
  8. 网络会议openmeetings下的openmeetings-util文件分析3
  9. TensorFlow Serving 使用 及 部署
  10. MySQL8 设置远程访问授权