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$被砍, ...
随机推荐
- spring学习十九 常用注解
1. @Component 创建类对象,相当于配置<bean/>2. @Service 与@Component 功能相同. 2.1 写在 ServiceImpl 类上.3. @Reposi ...
- Windows AD域管理软件是什么?
Windows AD域管理软件是什么? ADManager Plus是一个简单易用的Windows AD域管理工具,帮助域管理员简化日常的管理工作.通过直观友好的操作界面,可以执行复杂的管理操作,比如 ...
- chmod / chown /chattr
显示了七列信息,从左至右依次为:权限.文件数.归属用户.归属群组.文件大小.创建日期.文件名称 d :第一位表示文件类型 d 文件夹 - 普通文件 l 链接 b 块设备文件 p 管道文件 c 字符设备 ...
- oracle 大量连接导致数据库不能登录
系统遇到过几次这种问题,一个系统申请的session数过大,导致数据库进程数满,无法连接的问题. pl sql develope 报的错误是:ORA-12170:TNS:链接超时 oracle用户登录 ...
- Jetty 9的使用
参考来源:https://www.cnblogs.com/empireghost/p/3522834.html
- mysql 数据插入优化方法(concurrent_insert=2)
当一个线程对一个表执行一个DELAYED语句时,如果不存在这样的处理程序,一个处理器线程被创建以处理对于该表的所有DELAYED语句.通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询 ...
- 2019.01.17 bzoj1854: [Scoi2010]游戏(二分图匹配)
传送门 二分图匹配菜题. 题意:nnn个二元组(xi,yi)(x_i,y_i)(xi,yi),每个二元组可以选一个数总共nnn个数aia_iai,问将aia_iai排好序之后从111开始最多可 ...
- 分分钟搞懂rank() over(partition by)的使用
一.rank() over(partition by ...order by) 解释:partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组. 二.语法:ROW_NUM ...
- HTTP 错误 500.XX - Internal Server Error 解决办法
HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息 模块 IIS Web Core 通知 未知 处理程序 尚未 ...
- AngularJS实战之路由ui-view传参
angular路由传参 首页 <!DOCTYPE html> <html ng-app="app"> <head> <title>路 ...