Code Chef MINPOLY(计算几何+dp)
题面
题解
我们枚举这个凸多边形\(y\)坐标最小的点\(p_i\),然后对于所有\(y\)坐标大于等于它的点极角排序
我们预处理出\(s_{j,k}\)表示三角形\(p_i,p_j,p_k\)内部的点的\(b\)总和(不包括边界),然后记\(dp_{i,j,k}\)表示这个凸多边形之前两个点是\(p_i,p_j\),还需要\(k\)个点,最小的\(b\)是多少,然后可以直接记忆化搜索
//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=55,inf=0x3f3f3f3f;
typedef long long ll;
struct Point{
int x,y,v;
inline Point(){}
inline Point(R int xx,R int yy,R int vv):x(xx),y(yy),v(vv){}
inline Point operator +(const Point &b)const{return Point(x+b.x,y+b.y,v);}
inline Point operator -(const Point &b)const{return Point(x-b.x,y-b.y,v);}
inline ll operator *(const Point &b)const{return 1ll*x*b.y-1ll*y*b.x;}
inline ll norm(){return 1ll*x*x+1ll*y*y;}
}p[N],c;
inline bool Right(const Point &a,const Point &b,const Point &c){return (c-a)*(b-a)>0;}
inline bool in(const Point &a,const Point &b,const Point &c,const Point &d){
return Right(a,d,b)&&Right(b,d,c)&&Right(c,d,a);
}
inline bool cmpy(const Point &a,const Point &b){return a.y>b.y||(a.y==b.y&&a.x>b.x);}
inline bool cmpp(const Point &a,const Point &b){
R ll k=(a-c)*(b-c);
return k?k<0:(a-c).norm()<(b-c).norm();
}
int f[N][N][N],s[N][N],ans[N],n,ed,ttt;
int solve(int las,int now,int cnt){
if(!cnt)return 0;if(~f[las][now][cnt])return f[las][now][cnt];
int res=inf;
fp(i,now+1,ttt-1)if(Right(p[now],p[i],p[las]))cmin(res,solve(now,i,cnt-1)+p[i].v+s[now][i]);
return f[las][now][cnt]=res;
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d",&n);
fp(i,1,n)scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].v),ans[i]=inf;
sort(p+1,p+1+n,cmpy);
fd(t,n,1){
memset(f,-1,sizeof(f));
c=p[t],sort(p+1,p+t,cmpp),ttt=t;
fp(i,1,t-1)fp(j,i+1,t-1){
s[i][j]=0;
fp(k,i+1,j-1)if(in(c,p[j],p[i],p[k])||(p[k]-c)*(p[j]-c)==0)s[i][j]+=p[k].v;
}
for(R int i=1,v=0;i<t;++i){
v=((p[i]-c)*(p[i-1]-c)==0?v:0)+p[i].v;
fp(cnt,3,t)cmin(ans[cnt],c.v+v+solve(t,i,cnt-2));
}
sort(p+1,p+t,cmpy);
}
fp(i,3,n)printf("%d%c",ans[i]>1e7?-1:ans[i]," \n"[i==n]);
return 0;
}
Code Chef MINPOLY(计算几何+dp)的更多相关文章
- sdut 2153:Clockwise(第一届山东省省赛原题,计算几何+DP)
Clockwise Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Saya have a long necklace with ...
- Code Chef DARTSEGM(计算几何+凸包)
题面 传送门 题解 好眼熟丫-- 一月月赛最后一题--,代码都不用改-- //minamoto #include<bits/stdc++.h> #define R register #de ...
- Code Chef IMPO(计算几何+扫描线+积分)
题面 传送门 前置芝士 扫描线,积分求面积 题解 我怎么老是忘了积分可以求面积-- 首先,这两个投影的最小的\(x\)坐标和最大的\(x\)坐标必须相等,否则肯定无解 我们考虑一种方法,枚举\(x\) ...
- ZOJ 3494 BCD Code(AC自动机+数位DP)
BCD Code Time Limit: 5 Seconds Memory Limit: 65536 KB Binary-coded decimal (BCD) is an encoding ...
- POJ3178 计算几何+DP
//一些点一些圆,过圆不能连线,相邻点不能连线,问最多连几条线 //计算几何模板+区间dp //关键是判断圆和线段是否相交 #include <cstdio> #include <c ...
- 『HGOI 20190917』Cruise 题解 (计算几何+DP)
题目概述 在平面直角坐标系的第$1$象限和第$4$象限有$n$个点,其中第$i$个点的坐标为$(x_i,y_i)$,有一个权值$p_i$ 从原点$O(0,0)$出发,不重复的经过一些点,最终走到原点, ...
- zoj3494 BCD Code(AC自动机+数位dp)
Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by ...
- zoj3494BCD Code(ac自动机+数位dp)
l链接 这题想了好一会呢..刚开始想错了,以为用自动机预处理出k长度可以包含的合法的数的个数,然后再数位dp一下就行了,写到一半发现不对,还要处理当前走的时候是不是为合法的,这一点无法移到trie树上 ...
- 【Code Chef】April Challenge 2019
Subtree Removal 很显然不可能选择砍掉一对有祖先关系的子树.令$f_i$表示$i$子树的答案,如果$i$不被砍,那就是$a_i + \sum\limits_j f_j$:如果$i$被砍, ...
随机推荐
- Mac下Maven安装与配置
Mac下Maven安装与配置 下载maven http://maven.apache.org/download.cgi main->download菜单下的Files 下载后解压在Documen ...
- 2018.11.30 spoj220 Relevant Phrases of Annihilation(后缀数组+二分答案)
传送门 代码: 先用特殊字符把所有字符串连接在一起. 然后二分答案将sasasa数组分组. 讨论是否存在一个组满足组内对于每一个字符串都存在两段不相交字串满足条件. #include<bits/ ...
- 2018.10.25 uoj#308. 【UNR #2】UOJ拯救计划(排列组合)
传送门 有一个显然的式子:Ans=∑A(n,i)∗用i种颜色的方案数Ans=\sum A(n,i)*用i种颜色的方案数Ans=∑A(n,i)∗用i种颜色的方案数 这个东西貌似是个NPCNPCNPC. ...
- 通过html文件生成PDF文件
/// <summary> /// 获取html内容,转成PDF(注册) /// </summary> public void DownloadPDFByHTML(string ...
- Java数组的初始化
1.动态初始化 数据类型 [] 变量名 = new 数据类型 [数组大小]; //数组的动态初始化 int [] arr = new int [3]; 2.静态初始化 数据类型 [] 变量名 = {元 ...
- Educational Codeforces Round 61 D 二分 + 线段树
https://codeforces.com/contest/1132/problem/D 二分 + 线段树(弃用结构体型线段树) 题意 有n台电脑,只有一个充电器,每台电脑一开始有a[i]电量,每秒 ...
- 哪些优秀的 Windows 小工具,类似 clover 或 everything
有哪些优秀的 Windows 小工具,类似 clover 或 everything? 目前已知的有everything, listary, total commander, clover, dexpo ...
- jquery页面隐藏和展开之间切换
html页面: <p id="myp4">默认情况下,这段话是隐藏的,点击按钮以后,这段话就展开,并且按钮上的值改变</p> <button id=& ...
- CentOS 利用Yum安装mysql后无法启动(MySQL Daemon failed to start.)
安装mysql-server [root@iZwz9cl4i8oy1reej7o8pmZ ~]# yum install -y mysql-server 进入/etc执行mysql_install_d ...
- Ethernet II和802.3
在卷一中:(章节二:数据链路层) 在T C P / I P协议族中,链路层主要有三个目的: (1)为IP模块发送和接收IP数据报: (2 )为ARP模块发送ARP请求和接收ARP应答: (3 )为RA ...