BZOJ4049 [Cerc2014] Mountainous landscape
首先对于一个给定的图形,要找到是否存在答案非常简单。。。
只要维护当然图形的凸包,看一下是否有线段在这条直线上方,直接二分即可,单次询问的时间复杂度$O(logn)$
现在用线段树维护凸包,即对于一个区间$[l, r]$,我们维护点$[P_l, P_{r +1}]$形成的凸包
于是每次查询只要在线段树上二分,总复杂度$O(nlogn + nlog^2n)$(建树 + 查询)
1 /************************************************************** 2 Problem: 4049 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:5052 ms 7 Memory:73960 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <vector> 12 13 using namespace std; 14 typedef long long ll; 15 const int N = 1e5 + 5; 16 17 int read(); 18 19 int n; 20 21 struct point { 22 int x, y; 23 point(int _x, int _y) : x(_x), y(_y) {} 24 point() {} 25 26 inline point operator + (const point &p) const { 27 return point(x + p.x, y + p.y); 28 } 29 inline point operator - (const point &p) const { 30 return point(x - p.x, y - p.y); 31 } 32 inline ll operator * (const point &p) const { 33 return 1ll * x * p.y - 1ll * y * p.x; 34 } 35 36 inline void get() { 37 x = read(), y = read(); 38 } 39 40 friend inline ll calc(const point &a, const point &b, const point &c) { 41 return (a - b) * (c - b); 42 } 43 } p[N]; 44 45 struct convex { 46 vector <point> s; 47 48 inline void clear() { 49 s.clear(); 50 } 51 #define top ((int) s.size() - 1) 52 inline void insert(const point &p) { 53 while (top > 0 && calc(p, s[top - 1], s[top]) <= 0) s.pop_back(); 54 s.push_back(p); 55 } 56 57 #define mid (l + r >> 1) 58 inline bool query(const point &p, const point &q) { 59 int l = 0, r = top - 1; 60 while (l < r) { 61 if (calc(s[mid], p, q) < calc(s[mid + 1], p, q)) r = mid; 62 else l = mid + 1; 63 } 64 return calc(s[l], p, q) < 0 || calc(s[l + 1], p, q) < 0; 65 } 66 #undef mid 67 #undef top 68 }; 69 70 struct seg { 71 seg *ls, *rs; 72 convex c; 73 74 #define Len (1 << 16) 75 inline void* operator new(size_t, int f = 0) { 76 static seg mempool[N << 2], *c; 77 if (f) c = mempool; 78 c -> ls = c -> rs = NULL, c -> c.clear(); 79 return c++; 80 } 81 #undef Len 82 83 #define mid (l + r >> 1) 84 void build(int l, int r) { 85 int i; 86 for (i = l; i <= r + 1; ++i) c.insert(p[i]); 87 if (l == r) return; 88 (ls = new()seg) -> build(l, mid); 89 (rs = new()seg) -> build(mid + 1, r); 90 } 91 92 int query(int l, int r, int L, int R, const point &p, const point &q) { 93 if (R < l || r < L) return 0; 94 if (L <= l && r <= R) { 95 if (!c.query(p, q)) return 0; 96 if (l == r) return l; 97 } 98 int res = ls -> query(l, mid, L, R, p, q); 99 return res ? res : rs -> query(mid + 1, r, L, R, p, q); 100 } 101 #undef mid 102 } *T; 103 104 int main() { 105 int Tmp, i; 106 for (Tmp = read(); Tmp; --Tmp) { 107 n = read(); 108 for (i = 1; i <= n; ++i) p[i].get(); 109 (T = new(1)seg) -> build(1, n - 1); 110 for (i = 1; i < n - 1; ++i) 111 printf("%d ", T -> query(1, n - 1, i + 1, n - 1, p[i], p[i + 1])); 112 puts("0"); 113 } 114 return 0; 115 } 116 117 inline int read() { 118 static int x; 119 static char ch; 120 x = 0, ch = getchar(); 121 while (ch < '0' || '9' < ch) 122 ch = getchar(); 123 while ('0' <= ch && ch <= '9') { 124 x = x * 10 + ch - '0'; 125 ch = getchar(); 126 } 127 return x; 128 }
View Code
转载于:https://www.cnblogs.com/rausen/p/4528869.html
BZOJ4049 [Cerc2014] Mountainous landscape相关推荐
- 一步步指导 AI 画一幅中国山水画
在 「AI 作画第二弹」这篇文章中,我给大家介绍了 AI 作画工具在 Linux 系统上的部署.如果对 Linux 系统不熟,或者显卡比较低端,也可以考虑一些在线网站.国内比较好的网站有: 文心一格 ...
- Android :landscape||portrait 切换
可在AndroidManifest.xml里面配置屏幕发现. 在<Activity>中加入这一行android:screenOrientation="landscape/port ...
- System Landscape Recommendations for SAP Customer Activity Repository
System Landscape Recommendations for SAP Customer Activity Repository 该PDF文件可以在如下链接里下载: System Lands ...
- Great Power, Great Responsibility: The 2018 Big Data AI Landscape
http://mattturck.com/bigdata2018/ It's been an exciting, but complex year in the data world. Just as ...
- 动态更改屏幕方向LANDSCAPE与PORTRAIT 转
动态更改屏幕方向--LANDSCAPE与PORTRAIT package irdc.ex05_22; import android.app.Activity; import android.conte ...
- CERC17 Problem L - Lunar Landscape(差分,坐标系)
CERC17 Problem L - Lunar Landscape Solution 如果只有AAA,我们可以简单地使用差分解决. 加入了BBB之后,可以把单位正方形用对角线拆成四个等腰Rt,统计等 ...
- landscape 1
1. 创建出landscape的分层材质 2. 把材质添加给landscape后,可以在landscape的画刷模式下看到 3. 通过点击右侧的加号,依次添加layer后,就可以使用他们进行地形的绘制 ...
- hexo需要先编辑好html文件吗,教你定制Hexo的landscape打造自己的主题_html/css_WEB-ITnose...
我敢肯定大家不仅想拥有自己的博客,还想有一套自己的主题.目前Hexo的主题多数都是从官方主题landscape修改而成的,然而别人能修改,你也可以修改,就算你不会编程,不会web前端,跟着我做你一样可 ...
- CNCF landscape 云原生 敏捷开发
CNCF landscape 敏捷价值观和原则的开发方法包括: 极限编程(XP),Scrum,精益软件开发(Lean Software Development),动态系统开发方法(DSDM),特征驱动 ...
- 能量景观(Energy landscape)
文章目录 1. 简介 2. 应用 3. 正式定义 3.1 宏观例子 1. 简介 图 世界社会经济系统的简化能量景观,和不同细节层次的社会倾斜的动态(social tipping dynamics),突 ...
最新文章
- 零基础入门学习Python(14)-格式化字符串
- 实体识别+entity resolution
- Ubuntu 16.04 amd64 bond mode6 配置
- MooTools教程(1):认识MooTools
- cursor的moveToNext()与moveToFirst()
- swoole学习(一)----linux安装swoole
- java8 lambda 接口_Java8新特性之一:Lambda表达式
- Question for recommendation system, which is a baseline
- TP5安装失败怎么办?
- 深度学习:优化器工厂,各种优化器介绍,numpy实现深度学习(一)
- Struts知识问答
- cvMat结构体详解
- [SDOI2011]打地鼠
- HDU 1556 Color the ball 线段树
- 我们怎么样把pdf格式转换成dwg格式呢
- Jmeter小程序压力测试案例
- Zepto中touch模块的使用(移动端)
- Windows10的右键菜单添加“管理员取得所有权”
- 第13节 eclipse简介
- 虚地址到实地址的翻译过程
热门文章
- 华为公有云,一个关于天分与勤奋的故事
- html写樱花树,写樱花树的作文
- CAPM模型和Alpha策略
- Excel文档瘦身,一键压缩xlsx文件中所有的图片,解决excel文件太大的问题
- python网络爬虫笔记
- 关于JAVAFX的鼠标单击事件案例
- 九阴真经 正在获取服务器列表信息,九阴真经4月9日更新内容介绍_九阴真经4月9日更新公告_飞翔教程...
- web(Response、ServletContext)
- 《植物大战僵尸(PC)》游戏评测
- p2psear正在连接服务器,P2PSearcher无法连接到网络,也无法连接到服务器