codeforces 70D 动态凸包
来源:互联网 发布:淘宝卖家怎么品牌授权 编辑:程序博客网 时间:2024/06/05 18:20
http://www.codeforces.com/problemset/problem/70/D
两种操作
1:增加一个点,会形成一个新的凸包
2:判断某个点是否在凸包内
有两种方法可以做,不过都类似的,都是根据求凸包的方法来做的。
比如,用水平序求凸包的时候,会有两条凸线,一条上凸折线,一条下凸折线,那么判断一个点在这个凸包内就是判断这个点是否在上凸折线的下方以及是否在下凸折线的上方
如上图所示是一条下凸折线,新增点now在折线的下方,即在凸包外部,所以要找到水平序相邻的两个点p x,然后左边从p开始,利用叉积判断不断的删点,右边类似。。最后两条红色的线就是新的凸包的边,p q x 由于now这个点的加入而被删除了。
加入一个点的时候,我们需要找到凸线上水平序相邻的两个点,然后向两边不停的删点,直到满足凸包的定义为止
找到相邻的两个点可以用平衡树,用stl的话会简便很多很多。
注:一个小细节,传参数的时候没加引用,直接TLE了
#include <cstdio>#include <map>#include <algorithm>using namespace std;typedef pair<int, int> pii;typedef long long lld;#define MP make_pair#define X first#define Y secondmap<int, int> Convex[2];map<int, int>::iterator p , it , it1 , it2 ,q;lld cross(pii a, pii b, pii c) {return (lld) (b.X - a.X) *(c.Y - a.Y) - (lld) (b.Y - a.Y) *(c.X - a.X);}bool judge(map<int, int> &st, int x, int y) {if (!st.size()) return false;if (st.find(x) != st.end()) return y >= st[x];if (x < st.begin()->X || (--st.end())->X < x) return false;p = st.lower_bound(x);q = p; q --;return cross(MP(x, y), *q, *p) >= 0;}void insert(map<int, int> &st, int x, int y) {if (judge(st, x, y)) return; st[x] = y;p = st.upper_bound(x);it1 = it2 = it = p; it-- ; it1 = it; it1--; it2 = it1; it2--;if(p != st.end() ){ q = p; q++;while(q != st.end() && cross(MP(x,y),*q,*p) >= 0){st.erase(p);p = q;q ++;}}if(it == st.begin() || it1 == st.begin()) return ;while(it1 != st.begin() && cross(MP(x,y),*it1,*it2) >= 0){st.erase(it1); it1 = it2 ; it2 --;}}int main() {int Q, op, x, y;scanf("%d", &Q);while (Q--) {scanf("%d%d%d", &op, &x, &y);if (op == 1) {insert(Convex[0], x, y);insert(Convex[1], x, -y);} else {bool ans1 = judge(Convex[0], x, y) ;bool ans2 = judge(Convex[1], x, -y);if (ans1 && ans2)puts("YES");elseputs("NO");}}return 0;}
- codeforces 70D 动态凸包
- Codeforces 70D Professor's task [动态凸包]
- Codeforces 70D 动态凸包 (极角排序 or 水平序)
- codeforces 229/D 动态规划
- Codeforces 611D 动态规划
- codeforces D. Palindrome pairs 动态规划
- codeforces #186 D 动态规划(DP)
- codeforces 4D Mysterious Present -- 动态规划
- Codeforces 474D Flowers 动态规划法
- codeforces 484D Kindergarten 【动态规划】
- Codeforces 809D [平衡树][动态规划]
- CodeForces 406 D.Hill Climbing (凸包-Graham扫描法+在线倍增LCA)
- codeforces 303 D. Ilya and Roads(动态规划)
- Codeforces 448D(动态规划、类H数)
- Codeforces 379D. New Year Letter【动态规划、暴力枚举】
- CodeForces - 148D Bag of mice(动态规划)
- 【动态规划】【数位DP】[Codeforces 55 D]Beautiful numbers
- CodeForces 273D|Dima and Figure|动态规划
- C++输出二进制、十进制、八进制和十六进制总结
- OData v3与WCF Data Services 5.x简介
- 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场
- codeforces round 160(完全)
- c++编程风格----读书笔记(1)
- codeforces 70D 动态凸包
- c++编程风格----读书笔记(2)
- MATLAB 3D 动画制作(二)- 3D 动画动作设计
- MATLAB 3D 动画制作(三)- 实时随动3D动画设计
- VC编写的程序不能在其他机器上运行的解决方案(续)
- JavaScript的表达式解析器-1.引言
- 黑马程序员 07 Servlet 学习笔记 01
- 黑马程序员 08 Servlet 学习笔记 02 生命周期与servletCofig
- 黑马程序员 09 Servlet 学习笔记 03 HttpServlet