题意:给出平面上\(n\)个点,要求选出\(k\)个点,使得这些点形成一个凸包,且凸包内部没有点,求最大面积。无解输出\(0\)。

题解:枚举凸包最左的点\(p\),删除所有在\(p\)左边的点,然后把\(p\)定为原点。将所有点按极角排序,相邻两个点之间连边,那么会形成一个星状多边形,合法的凸包一定在这个多边形内部。

先考虑求出这张图的visibility graph,显然合法的凸包所有边都是visibility graph上的边。求法大概是逆时针枚举所有点,对于每个点维护一个队列维护未来可能加入的边,实际上是对于每个点\(i\),维护所有满足\(ij\)在visibility graph上,并且当前还没找到\(k(k>i)\)使得\(jk\)在visibility graph上的\(j\),详见代码。复杂度\(O(E)\)。

考虑在visibility graph上DP。顺时针枚举所有点,设\(f_{i,j,k}\)表示最后一条选取的边为\(i,j\),选了\(k\)条边的最大面积。转移时可以枚举一个\(l\),如果\(i,j\)和\(l,i\)这两条边可以同时存在(不会使得凸包不满足凸性)则可以转移到\(f_{l,i,k+1}\)。朴素DP复杂度\(O(n^3k)\),可以对于每个点将转移出去和进来的边分别排序后(其实根据求visibility graph的过程,这些边是已经排好序的)双指针+前缀和优化,复杂度\(O(n^2k)\)。

总复杂度\(O(n^3k)\)。

#include<bits/stdc++.h>
using namespace std;
const int N = 210;
typedef long long ll;
typedef double db;
#define pb push_backint gi() {int x = 0, o = 1;char ch = getchar();while((ch < '0' || ch > '9') && ch != '-') {ch = getchar();}if(ch == '-') {o = -1, ch = getchar();}while(ch >= '0' && ch <= '9') {x = x * 10 + ch - '0', ch = getchar();}return x * o;
}struct point {int x, y;db k;point(int x = 0, int y = 0): x(x), y(y) {k = atan2(y, x);}point operator-(const point &A) const {return point(x - A.x, y - A.y);}ll operator%(const point &A) const {return 1ll * x * A.y - 1ll * y * A.x;}bool operator<(const point &A) const {return k < A.k;}
} a[N], p[N];int n, m, tt;
ll f[N][N][55], mx[55], ans = 0;
queue<int> q[N];
vector<int> E[N], G[N];void add(int x, int y) {while(!q[x].empty() && (p[q[x].front()] - p[x]) % (p[y] - p[x]) < 0) {add(q[x].front(), y), q[x].pop();}G[x].pb(y), E[y].pb(x), q[y].push(x);
}int main() {
#ifndef ONLINE_JUDGEfreopen("a.in", "r", stdin);freopen("a.out", "w", stdout);
#endifcin >> n >> m;for(int i = 1; i <= n; i++) {a[i].x = gi(), a[i].y = gi();}for(int s = 1; s <= n; s++) {tt = 0;for(int i = 1; i <= n; i++) if(a[i].x > a[s].x || (a[i].x == a[s].x && a[i].y > a[s].y)) {p[++tt] = a[i] - a[s];}sort(p + 1, p + tt + 1);for(int i = 1; i <= tt; i++) {E[i].clear(), G[i].clear();while(!q[i].empty()) {q[i].pop();}}for(int i = 1; i < tt; i++) {add(i, i + 1);}memset(f, 0xc0, sizeof(f));for(int i = tt; i; i--) {memset(mx, 0xc0, sizeof(mx));reverse(E[i].begin(), E[i].end());int cur = G[i].size() - 1;for(auto j : E[i]) {f[i][j][1] = p[j] % p[i];while(~cur && (p[j] - p[i]) % (p[G[i][cur]] - p[i]) < 0) {for(int k = 1; k < m; k++) {mx[k] = max(mx[k], f[G[i][cur]][i][k]);}--cur;}for(int k = 1; k < m; k++) {f[i][j][k + 1] = mx[k] + p[j] % p[i];}}}for(int i = 1; i <= tt; i++)for(auto j : E[i]) {ans = max(ans, f[i][j][m - 2]);}}printf("%.2lf\n", 1.0 * ans / 2);return 0;
}

转载于:https://www.cnblogs.com/gczdajuruo/p/10922492.html

[CF852H]Bob and stages相关推荐

  1. [译] Bob,函数式编程是什么鬼?

    原文地址:Intro to Swift Functional Programming with Bob 原文作者:Bob Lee 译文出自:掘金翻译计划 译者:Deepmissea 校对者:thank ...

  2. Trie树合并 + SG函数 ---- BZOJ4730. Alice和Bob又在玩游戏(动态开点Trie 树上全局异或标记 + 合并 + 博弈论)

    题目大题 题目大意: 解题思路: 首先我们对于子树u的SG函数为SG函数为SG函数为 ⨁是异或和\bigoplus是异或和⨁是异或和 SG[u]=mex{⨁w∈(w的父亲在u到v的路径上)SG[w]∣ ...

  3. 微软副总裁Bob Muglia对Silverlight的公开道歉信

    简单回顾,事件起因 微软负责服务器和工具业务的副总裁Bob Muglia,在PDC 10(微软专业开发人员大会)上发表一些对HTML 5和Silverlight看法,很快国外著名IT新闻网ZDNET发 ...

  4. POJ 1704 Georgia and Bob (Nim游戏变形)

    题目:http://poj.org/problem?id=1704 思路:Nim游戏策略,做如下转换,如果N是偶数,则两两配对,将两个数之间的格子数(距离)看做成这一堆石头的数量. 如果N是奇数,则将 ...

  5. 【清华集训2016】Alice和Bob又在玩游戏

    不难的题目.因为SG性质,所以只需要对一棵树求出. 然后如果发现从上往下DP不太行,所以从下往上DP. 考虑一个点对子树的合并,考虑下一个删的点在哪一个子树,那么剩下的状态实际上就是把一个子树所有能达 ...

  6. Sicily1798. Alice and Bob[策略问题]

    [原题描述] Description Bob is very famous because he likes to play games. Today he puts a chessboard in ...

  7. SDUT2608(Alice and Bob)

    题目描述 Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynom ...

  8. hdu 4268 Alice and Bob(STL版)

    http://acm.hdu.edu.cn/showproblem.php?pid=4268 这是今天网络赛的水题,下午短路了,没想到怎么做.队友hq是用treap做的,不过赛后我才想懂怎么做,回到宿 ...

  9. BUUCTF [FlareOn1]Bob Doge [GXYCTF2019]

    文章目录 [GXYCTF2019]SXMgdGhpcyBiYXNlPw== [FlareOn1]Bob Doge [GXYCTF2019]SXMgdGhpcyBiYXNlPw== 拿到一个题目,打开后 ...

最新文章

  1. 麦肯锡:优秀数据科学家的5个特征!
  2. 浏览器传输乱码编解码处理
  3. c# winform编程之多线程ui界面资源修改总结篇
  4. MIT自然语言处理第三讲:概率语言模型(第一、二、三部分)
  5. 关于优酷开放SDK中setOnRealVideoStartListener
  6. CSS :before :after 伪类选择器
  7. dubbo-环境搭建,实现一个简单地dubbo实例(附github地址)
  8. mysql二进制日志特点_MySQL二进制日志分析-概述篇
  9. 覆盖ftp服务器上面的图片后网站的原图为什么不变呀?,Win7下架设FTP服务器失败的原图...
  10. UnityWebform(2):自定义LifetimeManager和TypeConverter使Unity从HttpContext中取值注入WebForm页面...
  11. oracle从子表取出前几行数据:
  12. [转]使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger
  13. 专访黑石集团CEO苏世民:“我们能见他人所不能见”/巴伦独家
  14. JavaScript实现图片上传并预览并提交
  15. java所有单词汇总
  16. 《麻省理工学院公开课:人工智能》笔记一
  17. Java——SOF 与 OOM
  18. Liunx官网下载步骤
  19. docker(12):Dockerfile
  20. 神经网络程序设计课学习心得

热门文章

  1. 第 11 章 Scrapy - Python web scraping and crawling framework
  2. 优惠券项目---------------第十三章
  3. springboot +thymeleaf 实现本地图片显示,和数据库查询显示
  4. tomcat 400错误跳转自定义页面
  5. gprs tcp 协议 汽车 服务器,基于GPRS的车辆检测通信系统设计毕业论文.doc
  6. 为什么要使用ORM框架
  7. November 7th 2016 Week 46th Monday
  8. 学UI设计有前途吗?内附课程资源
  9. List集合删除指定对象,使用removeIf
  10. mui.pullrefresh.js使用详解