[hdu5033]单调队列
题意:x轴上有n棵树,询问你站在某个点的视角。从左至右,单调队列(类似凸包)维护下。我强迫症地写了个模板QAQ
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <map>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <ctime>
#include <cctype>
#include <set> using namespace std; #define mem0(a) memset(a, 0, sizeof(a))
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define define_m int m = (l + r) >> 1
#define Rep(a, b) for(int a = 0; a < b; a++)
#define lowbit(x) ((x) & (-(x)))
#define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {}
#define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {}
#define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {} typedef double db;
typedef long long LL;
typedef pair<int, int> pii;
typedef multiset<int> msi;
typedef multiset<int>::iterator msii;
typedef set<int> si;
typedef set<int>::iterator sii;
typedef vector<int> vi; const int dx[] = {, , -, , , , -, -};
const int dy[] = {, -, , , -, , , -};
const int maxn = 1e5 + ;
const int maxm = 1e5 + ;
const int maxv = 1e7 + ;
const int MD = 1e9 +;
const int INF = 1e9 + ;
const double PI = acos(-1.0);
const double eps = 1e-; struct Point {
int x, y;
bool operator < (const Point &opt) const {
return x < opt.x || x == opt.x && y < opt.y;
}
double abs() {
return sqrt((double)x * x + (double)y * y);
}
Point operator - (const Point &opt) const {
return Point(x - opt.x, y - opt.y);
}
double operator * (const Point &opt) const {
return (double)x * opt.x + (double)y * opt.y;
}
constructInt2(Point, x, y);
void inp() {
scanf("%d %d", &x, &y);
}
void outp() {
printf("(%d, %d), ", x, y);
}
}; bool cmp(const pii &a, const pii &b) {
return a.first < b.first;
} double Cross(const Point &a, const Point &b) {
return (double)a.x * b.y - (double)a.y * b.x;
} template<class T> struct MonotoneQueue{
deque<T> Q;
MonotoneQueue<T>() { Q.clear(); }
T back() { return Q.back(); }
T back2() { if (Q.size() < ) return T(); return *(Q.end() - ); }
T front() { return Q.front(); }
void clear() { Q.clear(); }
bool empty() { return Q.empty(); }
void add_back(T x) { while (!empty() && !(back() - back2() < x - back2())) Q.pop_back(); Q.push_back(x); }
void pop_front() { Q.pop_front(); }
}; double toDegree(double x) { return x * 180.0 / PI; } Point p[maxn], L[maxn], R[maxn];
pii qry[maxn];
int n, m; struct Node {
Point dot;
bool operator < (const Node &a) const {
return Cross(dot, a.dot) < eps;
}
Node operator - (const Node &opt) const {
return Node(dot - opt.dot);
}
Node(Point dot = Point()): dot(dot) {}
};
MonotoneQueue<Node> DQ; void work(Point a[]) {
DQ.clear();
DQ.add_back(p[]);
int now = ;
for (int i = ; i < m; i++) {
while (now < n && p[now].x < qry[i].first) {
DQ.add_back(Node(p[now++]));
}
DQ.add_back(Node(Point(qry[i].first, )));
a[qry[i].second] = (DQ.back2() - DQ.back()).dot;
}
} int main() {
//freopen("in.txt", "r", stdin);
int T, cas = ;
cin >> T;
while (T--) {
cin >> n;
for (int i = ; i < n; i++) {
p[i].inp();
}
sort(p, p + n);
cin >> m;
for (int i = , x; i < m; i++) {
scanf("%d", &x);
qry[i] = make_pair(x, i);
}
sort(qry, qry + m, cmp); work(L); for (int i = ; i < n; i++) {
p[i].x = maxv - p[i].x;
}
sort(p, p + n);
for (int i = ; i < m; i++) {
qry[i].first = maxv - qry[i].first;
}
sort(qry, qry + m, cmp); work(R);
for (int i = ; i < m; i++) {
R[i].x = -R[i].x;
} printf("Case #%d:\n", ++cas);
for (int i = ; i < m; i++) {
printf("%.10f\n", toDegree(acos(L[i] * R[i] / L[i].abs() / R[i].abs())));
}
}
return ;
}
[hdu5033]单调队列的更多相关文章
- hdu5033 Building 单调队列
// hdu5033 Building 单调队列 // // 题目大意: // // n栋大楼,有一个高度h和位置x.如今有一个人高度为0,有q个询问 // 每一个询问有一个位置x,求在位置x能看到天 ...
- BestCoder Round #89 B题---Fxx and game(单调队列)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945 问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路: B ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
- BZOJ 1047 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...
- 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列
第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- hdu 3401 单调队列优化DP
Trade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- 【转】单调队列优化DP
转自 : http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减.队 ...
随机推荐
- phpMyAdmin后台文件包含溯源
先上大佬解释的漏洞原理链接 https://mp.weixin.qq.com/s?__biz=MzIzMTc1MjExOQ==&mid=2247485036&idx=1&sn= ...
- 漫谈LiteOS-端云互通组件-MQTT开发指南(上)
1.介绍 SDK简介 Agent Tiny是部署在具备广域网能力.对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报 ...
- IDEA惊天bug:进程已结束,退出代码-1073741819 (0xC0000005)
由于昨天要写的文章没有写完,于是今天早上我四点半就"自然醒"了,心里面有事,睡觉也不安稳.洗漱完毕后,我打开电脑,正襟危坐,摆出一副要干架的态势,不能再拖了. 要写的文章中涉及到一 ...
- ADO.NET(二)
对Command的拓展延伸 执行SQL语句. Command 对象需要取得将要执行的SQL语句,通过调用该类的多种方法,向数据库提交SQL语句. ExecuteNonQuery(),ExecuteR ...
- 将jar包发布到maven中央仓库
将jar包发布到maven中央仓库 最近做了一个swagger-ui的开源项目,因为是采用vue进行解析swagger-json,需要前端支持,为了后端也能方便的使用此功能,所以将vue项目编译后的结 ...
- 【认证与授权】Spring Security的授权流程
上一篇我们简单的分析了一下认证流程,通过程序的启动加载了各类的配置信息.接下来我们一起来看一下授权流程,争取完成和前面简单的web基于sessin的认证方式一致.由于在授权过程中,我们预先会给用于设置 ...
- HTTP 前世今生
HTTP 协议在我们身边随处可见,只要上网就离不开它.不论是用浏览器还是 App,不论是看新闻.短视频还是听音乐.玩游戏,后面总会有 HTTP 在默默为你服务. Http 协议是怎么来的?最开始是什么 ...
- JS在线代码编辑器多种方案monaco-editor,vue-monaco-editor
前言 JavaScript在线代码编辑器. 需要代码提示,关键字高亮,能够格式化代码.(不需要在线运行) 简简单单的需求. 方案一: Monaco-editor 简介:微软的开源项目,开源中国上面的在 ...
- Inno setup: check for new updates
Since you've decided to use a common version string pattern, you'll need a function which will parse ...
- zookeeper笔记(一)
title: zookeeper笔记(一) zookeeper 安装简记 解压文件 $ tar -zxvf zookeeper-3.4.10.tar.gz -C 安装目录 创建软连接(进入安装目录) ...