BZOJ4049 [Cerc2014] Mountainous landscape

news/2025/1/15 12:27:27/

首先对于一个给定的图形,要找到是否存在答案非常简单。。。

只要维护当然图形的凸包,看一下是否有线段在这条直线上方,直接二分即可,单次询问的时间复杂度$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


http://www.ppmy.cn/news/158519.html

相关文章

OpenCV vs. Armadillo vs. Eigen on Linux

OpenCV vs. Armadillo vs. Eigen on Linux From&#xff1a;http://nghiaho.com/?p936 In this post I’ll be comparing 3 popular C matrix libraries found on Linux. OpenCV 2.3.1Armadillo 2.2.1Eigen 3.0.3 OpenCV is a large computer vision library with matrix supp…

jenkins + maven + nexus + [ svn 或 GitLab 或 GitHub ]

目录 介绍 DevOps平台四大模块针对DevOps开源项目Jenkins 介绍Maven 介绍 maven的核心概念介绍SVN介绍Nexus介绍 Maven私服的 个特性&#xff1a;流程图环境搭建 环境准备配置JDK环境安装私服 Nexus安装 Maven 配置 Maven 连接 私服 Nexus安装 Jenkins rpm 包安装方式WAR 包安装…

可视化例子(8)——Maptalks-scatter3D-微博亮点数据

一、数据格式 数据中第一二个数是第一个点的经纬度的 1000 倍&#xff0c;后面数是后面点与第一个点的插值&#xff0c;如第一个点经纬度的 1000 倍为 73960、39707&#xff0c;第三四个数 132、102 分别是第二个点经纬度与第一个点经纬度的差值&#xff0c;后面类比&#xff1…

移植keil到IAR

IAR 6.3中intrinsics.h与core_cm3.h 中的兼容错误解决方法 标签&#xff1a; IARarmintrinsics.hcore_cm3.h 2016-01-26 09:52 166人阅读 评论(0) 收藏 举报 解决办法1: 用IAR6.3打开IAR6.0 的工程&#xff0c;编译的时候出现提示错误&#xff1a; extern uint32_t __get_P…

cpuz测试分数天梯图_I7 3930K 不同频率下性能测试(CPUZ分数、功耗、游戏实测)

寒假回家,没能把台式机从学校搬回来,只好求助万能的某鱼搞台二手机放家里。 苦苦搜寻多日后,终于看到有个同城的老哥出手X79平台的机子,价格合理,除显卡外的配置也满足我的需求,经过0.5秒的考虑,我,下单了。闲鱼交易记录 具体配置为: CPU: I7 3930K 主板:华硕ROG R4G …

i7 3960x支持服务器内存吗,i7 3960x 性能如何?—前所未有的详细版测评

从目前Intel公布的资料来看&#xff0c;SNB-E首发将会有三款新产品诞生&#xff0c;他们分别是&#xff1a;4核心8线程倍频部分解锁的i7-3820&#xff0c;它的定位类似与LGA 1366接口的i7-980类似;然后是不锁倍频的i7-3930K&#xff0c;6核心12线程设计&#xff0c;三级缓存12M…

使用kettle进行日志分析

分析日志是一个大数据分析中较为常见的场景。在Unix类操作系统里&#xff0c;Syslog广泛被应用于系统或者应用的日志记录中。Syslog通常被记录在本地文件内&#xff0c;比如Ubuntu内为/var/log/syslog文件名&#xff0c;也可以被发送给远程Syslog服务器。Syslog日志内一般包括产…

Huawei华为交换机远程Telnet配置

https://blog.csdn.net/qq_31422671/article/details/84846356 [HUAWEI-ui-vty0-4]protocol inbound telnet