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 }

时间: 2024-10-01 06:56:40

BZOJ4049 [Cerc2014] Mountainous landscape的相关文章

Mountainous landscape

Portal --> broken qwq Solution ? 所以我不是很懂为什么我场上想到了凸包的解法但是..老想着..要整体处理==有毒 ? 一开始..自己进入了一个误区就是老想着要求交点 ?? 但是很显然求交点你就凉了,所以我们要转化问题 ?? 我们把橙黄色的那条线画出来,然后就发现..其实我们是可以很方便地判断一段线段(\(P_3P_4\)),在某一个区间里面有没有解,具体的话就是..我们维护这个区间的上凸包,然后判断一下这条线跟是否与这个上凸包相交就好了 ?? 那然后就直接..线段

&quot;portrait&quot;(竖屏) &quot;landscape&quot;(横屏) css设置

取决于浏览器或者设备的方向,HTML元素总是会有"portrait"(竖屏) "landscape"(横屏) class. 你可以在css中如下使用它们: .portrait {/* 垂直方向的变化的代码 */}.landscape {/* 水平方向的变化的代码 */}

Android - Activity定制横屏(landscape)显示

Activity定制横屏(landscape)显示 本文地址: http://blog.csdn.net/caroline_wendy Android横屏(landscape)显示: android:screenOrientation="landscape" 可以在特定的Activity中声明,这个属性,则默认会是横屏; screenOrientation的属性需要定义在Activity内, 即AndroidManifest的<activity>; 作用于Activity的

iOS的横屏(Landscape)与竖屏(Portrait)InterfaceOrientation

转自:http://www.molotang.com/articles/1530.html 接着上篇写的触摸事件,这次借机会整理下iOS横屏和竖屏的翻转方向支持,即InterfaceOrientation相关的内容. 最近做一个页面,最初并没有太多考虑orientation的情况,当其嵌入到一个在iPad上使用横屏(Landscape)的应用中,就会只显示在屏幕的左面,而且貌似还没显示全,这个……很丑!发自内心地觉得这么做对不起苹果的设计理念!对不起乔老爷子... 改!说到该就要了解苹果开发中对

iPad apple-touch-startup-image实现portrait和landscape

iPad apple-touch-startup-image实现portrait和landscape 为ipad制作web应用程序的启动画面时发现个问题,只能显示竖屏图,横屏图出不来,网上的朋友都说无法解决,做了无数次尝试,终于成功,如下: 首先页面头部里要加入 <link rel="apple-touch-startup-image" media="screen and (orientation: portrait)" href="/apple_s

Houdini技术体系 基础管线(三) :UE4 Landscape Component的多选支持 下篇

背景 上篇中,我们介绍了如何修改Houdini Enigne来设置单个Landscape Compnent的Height和Layer的数据,但原生Houdini Engine并不支持多选Component的写回功能,下篇中,我们来解决这个问题. Component多选支持的修改 Houdini Engine虽然支持多个Landscape Component的选择,但是并不支持写回到Landscape Component,需要自己来实现这个功能.单个Component的实现方法上文已经接受. 多选

观文总结——A Survey of the Connected Vehicle Landscape—Architectures, Enabling Technologies, Applications, and Development

A Survey of the Connected Vehicle Landscape—Architectures, Enabling Technologies, Applications, and Development 随着连通性.感知能力.计算能力的发展,车辆可以被作为一个产生数据.执行推断.并对交通.社会.经济产生巨大影响的平台.连通和协作可以提高车辆(队)的安全和效率.这篇文章为读者介绍了车联网领域的关键技术.机遇和挑战. 关键词:连接车辆.远程信息技术.汽车应用.车辆自组织网络.汽车

CNCF LandScape Summary

CNCF Cloud Native Interactive Landscape 1. App Definition and Development 1. Database Vitess:itess is a database clustering system for horizontal scaling of MySQL. Apache CarbonData:Apache CarbonData is an indexed columnar data format for fast analyt

Essentially No Barriers in Neural Network Energy Landscape

目录 梗概 主要内容 path的定义 path的逼近 局部最优 Draxler F, Veschgini K, Salmhofer M, et al. Essentially No Barriers in Neural Network Energy Landscape[C]. international conference on machine learning, 2018: 1308-1317. 梗概 作者认为, 神经网络中,假设\(\theta_1, \theta_2\)都是使得损失达到最