是时候补补计算几何了。。
bzoj链接

题目大意

给你一条折线(顶点为p1,p2,…,pnp1,p2,…,pnp_1,p_2,\dots,p_n),求对于折线中每条线段向右延长与折线的第一个交点所在的线段(不能交于该线段的上端点)的编号(无解输出0)。

题解

用线段树维护当前区间lll至r" role="presentation" style="position: relative;">rrr的点的上凸壳。查询时在区间i+1,n−1i+1,n−1i+1,n-1寻找线段pi,pi+1pi,pi+1p_i,p_{i+1}与那个编号最小的上凸壳相交(因为第一个交点必定在上凸壳上)。pushuppushuppushup时直接凸包暴力合并,可以用二分加向量叉积判断是否在当前区间有交点。时间复杂度两个logloglog。

代码

//#pragma GCC optimize(3)
#include<iostream>
#include<iomanip>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<map>
#include<set>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#define ull unsigned long long
#define db double
#define ll long long
#define inf 100009
#define rd(n) {n=0;char ch;int f=0;do{ch=getchar();if(ch=='-'){f=1;}}while(ch<'0'||ch>'9');while('0'<=ch&&ch<='9'){n=(n<<1)+(n<<3)+ch-48;ch=getchar();}if(f)n=-n;}
using namespace std;
int n;struct point{int x,y;point(){}point(int xx,int yy){x=xx,y=yy;}
}p[inf];struct Vector{int x,y;Vector(){}Vector(point xx,point yy){x=xx.x-yy.x;y=xx.y-yy.y;}
};ll cal(Vector x,Vector y){return (ll)x.x*y.y-(ll)x.y*y.x;
}struct ConvexHull{vector <point> s;
}ch[inf*4];void CH_clear(ConvexHull &x){x.s.clear();return;
}void CH_insert(ConvexHull &x,point p){int cnt=x.s.size();while (cnt>1 && cal(Vector(x.s[cnt-1],x.s[cnt-2]),Vector(p,x.s[cnt-2]))>=0){x.s.pop_back();cnt--;}x.s.push_back(p);return;
}void CH_merge(ConvexHull &x,ConvexHull y){for (int i=0;i<y.s.size();i++){CH_insert(x,y.s[i]);}return;
}bool CH_find(ConvexHull x,point p1,point p2){Vector vec=Vector(p2,p1);int l=0,r=x.s.size()-1;if (l>r){return 0;}while (l<r){int mid=(l+r)/2;if (cal(Vector(x.s[mid],p1),vec)<cal(Vector(x.s[mid+1],p1),vec)){r=mid;}else{l=mid+1;}}if (cal(Vector(x.s[l],p1),vec)<0){return 1;}else if (l<x.s.size()-1 && cal(Vector(x.s[l],p1),vec)<0){return 1;}return 0;
}void ST_build(int u,int l,int r){if (l==r){CH_clear(ch[u]);CH_insert(ch[u],p[l]);CH_insert(ch[u],p[l+1]);return;}int mid=(l+r)/2;ST_build(u*2,l,mid);ST_build(u*2+1,mid+1,r);ch[u]=ch[u*2];CH_merge(ch[u],ch[u*2+1]);return;
}int ST_query(int u,int l,int r,int L,int R,point p1,point p2){if (L<=l && r<=R){if (!CH_find(ch[u],p1,p2)){return 0;}else if (l==r){return l;}}int mid=(l+r)/2,ans=0;if (L<=mid){ans=ST_query(u*2,l,mid,L,R,p1,p2);}if (ans){return ans;}if (R>mid){return ST_query(u*2+1,mid+1,r,L,R,p1,p2);}return 0;
}int main(){int T;rd(T)for (int t=1;t<=T;t++){rd(n)for (int i=1;i<=n;i++){rd(p[i].x) rd(p[i].y)}ST_build(1,1,n-1);for (int i=1;i<n;i++){printf("%d ",ST_query(1,1,n-1,i+1,n-1,p[i],p[i+1]));}puts("");}return 0;
}

【BZOJ4049】【Cerc2014】 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. 【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行)

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. BZOJ 2402 陶陶的难题II (树链剖分、线段树、凸包、分数规划)

    毒瘤,毒瘤,毒瘤-- \(30000\)这个数据范围,看上去就是要搞事的啊... 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2402 ...

  10. 线段树扫描线求矩形周长详解

    线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...

最新文章

  1. 四大组件之 Activity_任务和返回栈
  2. mysql 打印_故障分析 | MySQL:5.6大事务show engine innodb status故障一例
  3. springboot 访问html_Spring Boot中使用Spring Security进行安全控制
  4. 比较简单的创造印象派画风的网站
  5. HTML/CSS学习笔记01【概念介绍、基本标签】
  6. 深入mysql ON DUPLICATE KEY UPDATE 语法的分析
  7. ubuntu安装portainer_Docker【二】:Docker管理工具Portainer
  8. 数据结构05数组和广义表
  9. PHP 获取服务器详细信息【转】
  10. 下载电子书,给电子书添加总目录页面
  11. 速更新!流行的开源邮件客户端 Mozilla Thunderbird 91.3修复多个高危缺陷
  12. VLAN专题之三:VLAN的访问链接
  13. 医院大数据中心建设要点分析
  14. matlab vgg图像风格迁移,迁移网络的应用-图像风格迁移
  15. 社区宽带繁忙是什么意思_沈阳附近长城宽带安装申请多少钱欢迎咨询_畅鹏城通讯...
  16. 前端-JS基础之各类型常用api
  17. idea常用的搜索方式
  18. 高德地图react版本开源库react-amap与react-amap-next分析
  19. 在VB6中生成随机数
  20. mac电脑卸载LVSecurityAgent监控软件

热门文章

  1. mac电脑显示器分辨率显示异常
  2. linux 基础环境安装教程,Linux安装及初始环境设置基础教程
  3. 四川取消英语计算机考试,四川远程教育2019年英语考试取消了吗
  4. mac部署rabbitmq流程与异常总结
  5. win10系统点电脑无线图标没反应的,点设置里的显示可用网络没反应
  6. 魔众刮刮卡抽奖系统 v2.0.0 支付抽奖,更好用的刮刮卡系统
  7. 计网 | 链路层协议及大题解构
  8. sqlserver 2000操作数据库
  9. 使用 pandoc 进行文档转换(markdown转pdf)
  10. canva画图 图片居中裁剪_html5 canvas 自定义画图裁剪图片