共鸣(resonance)

题目描述

GHQ通过在24区引起基因组共鸣,从而引发了第二次失落的圣诞。

24区的地图可以视为一个二维平面。GHQ在24区布置了m架发射塔,而葬仪社也建立了n个据点。要阻止共鸣,需要顺次连接一些据点,连接的两个据点之间会形成屏障。所有屏障应构成一个多边形,称之为干扰场。干扰场的面积越大,起到的干扰效果就越强。

但是并非所有的连接方式都是有效的。其一,任意两块屏障不能在据点之外的位置相交;其二,干扰场中的任意一个位置都应该可以直接看到构成干扰场的所有据点。所谓直接看到是指视线不会穿过任意一块屏障。

更重要的一点是,干扰场内不能存在有GHQ布置的发射塔,而且屏障也不能穿过发射塔。如果这个条件不满足,干扰场根本无法发挥作用。

葬仪社需要设计一个构成干扰场的方案,使得干扰场的面积最大。请你协助他们。

输入

输入文件的第一行包含两个整数n和m,分别代表葬仪社的据点个数,以及GHQ设立的发射塔架数。

接下来n行,每行包含一个坐标,表示葬仪社的一个据点的位置。

接下来m行,每行包含一个坐标,表示GHQ布置的一架发射塔的位置。

坐标的每一维皆为绝对值不超过1000的整数。输入的任意两个坐标不相同。

输出

第一行输出一个非负实数,表示干扰场的最大面积。保留两位小数。

接下来的一行输出一个非负整数t,代表构成干扰场的据点数。

接下来的一行,按照顺时针或者逆时针顺序输出构成干扰场的t个顶点。

如果有多种构成面积最大的干扰场的方案,输出任意一个即可。

特别地,如果不存在拥有正面积的干扰场,则构成干扰场的据点数视为0。即,第二行输出0,第三行输出一个空行。

样例输入

【样例输入1】
3 1
0 0
3 0
0 4
1 1
【样例输入2】
4 1
0 0
3 0
3 3
0 3
1 0

样例输出

【样例输出1】
0.00
0
【样例输出2】
4.50
3
4 2 3

提示

【样例1解释】

唯一的正面积干扰场是由据点1、2、3构成的,但是发射塔1在这个干扰场内部,所以不存在合法的正面积干扰场。

注意第三行的空行。

【样例2解释】

如下图所示:

图中的点A、B、C、D对应据点1到4,点E对应发射塔1。有色部分为构成的干扰场。另外一组可行的解为据点1、3、4构成的干扰场。可以证明不存在面积更大的干扰场,或者其他面积相同的干扰场。

【评分方法】

此题有部分分。如果不存在输出文件,或者输出不符合规范,得0分。

如果面积正确,构造的方案是一个多边形但是不合法或者不正确,得3分。

如果面积正确,而且构造的方案正确,得5分。

【数据规模和约定】

所有测试点的数据规模如下:

测试点编号

n

m

1

n<=10

m<=10

2

3

4

5

n<=100

m=0

6

7

8

9

n<=50

m<=50

10

11

12

13

14

15

N<=100

m<=100

16

17

18

19

20

solution

暴力

先枚举起点S,然后另f[i][j]表示我当前走到i,上一步是j的最大面积

f[k][i]=f[i][j]+size(k,i,S)

然后把上下合并起来

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 102
#define eps 1e-4
#define inf 1e9
using namespace std;
int n,m,fr[maxn][maxn],gr[maxn][maxn],ansp[maxn],ansq[maxn],cntp,cntq;
bool flag[maxn][maxn][maxn];
struct po{
double x,y;int id;
}jd[maxn],fst[maxn];
double f[maxn][maxn],g[maxn][maxn],si[maxn][maxn][maxn];
bool cmp(po a,po b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
po xl(po a,po b){
po t;t.x=b.x-a.x;t.y=b.y-a.y;
return t;
}
double cj(po a,po b){
return a.x*b.y-a.y*b.x;
}
bool pd(po a,po b ,po c){
po x=xl(a,b),y=xl(b,c),z=xl(c,a);
for(int i=1;i<=m;i++){
po t1=xl(a,fst[i]),t2=xl(b,fst[i]),t3=xl(c,fst[i]);
if(cj(t1,x)>=0&&cj(t2,y)>=0&&cj(t3,z)>=0)return 0;
if(cj(t1,x)<=0&&cj(t2,y)<=0&&cj(t3,z)<=0)return 0;
}
return 1;
}
double size(po a,po b,po c){
po x=xl(a,b),y=xl(b,c);
double sum=abs(cj(x,y));
return sum/2;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){scanf("%lf%lf",&jd[i].x,&jd[i].y);jd[i].id=i;}
for(int i=1;i<=m;i++)scanf("%lf%lf",&fst[i].x,&fst[i].y);
sort(jd+1,jd+n+1,cmp);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++){
if(pd(jd[i],jd[j],jd[k]))flag[i][j][k]=1;
si[i][j][k]=size(jd[i],jd[j],jd[k]);
}
double ans=0;
for(int S=1;S<=n;S++){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)f[i][j]=g[i][j]=-inf;
for(int i=S+1;i<=n;i++)f[S][i]=g[S][i]=0;
for(int i=S;i<=n;i++)
for(int j=i+1;j<=n;j++)
for(int k=j+1;k<=n;k++){
po k1=xl(jd[i],jd[j]),k2=xl(jd[i],jd[k]);
if(cj(k1,k2)>=0&&flag[S][j][k]){
if(f[i][j]+si[S][j][k]>f[j][k]){
f[j][k]=f[i][j]+si[S][j][k];
fr[j][k]=i;
}
}
}
for(int i=S;i<=n;i++)
for(int j=i+1;j<=n;j++)
for(int k=j+1;k<=n;k++){
po k1=xl(jd[i],jd[j]),k2=xl(jd[i],jd[k]);
if(cj(k1,k2)<=0&&flag[S][j][k]){
if(g[i][j]+si[S][j][k]>g[j][k]){
g[j][k]=g[i][j]+si[S][j][k];
gr[j][k]=i;
}
}
}
for(int T=S+1;T<=n;T++){
for(int i=S;i<=T;i++){
for(int j=S;j<=T;j++){
if(f[i][T]+g[j][T]>ans){
ans=f[i][T]+g[j][T];
int ii=i,tt=T;cntp=2;
ansp[1]=T,ansp[2]=i;
while(ii!=S){
int tmp=ii;ii=fr[ii][tt];tt=tmp;
ansp[++cntp]=ii;
}
ii=j,tt=T,cntq=1;
ansq[1]=j;
while(ii!=S){
int tmp=ii;ii=gr[ii][tt];tt=tmp;
ansq[++cntq]=ii;
}
}
}
}
}
}
printf("%.2lf\n",ans);
if(!(cntp+cntq)){puts("0");return 0;}
cout<<cntp+cntq-1<<endl;
for(int i=1;i<=cntp;i++)cout<<jd[ansp[i]].id<<' ';
for(int j=cntq-1;j>=1;j--)cout<<jd[ansq[j]].id<<' ';
cout<<endl;
return 0;
}

共鸣(resonance)的更多相关文章

  1. NOTES : A Model of Gas Exchange for Hyperpolarized Xe(129) Magnetic Resonance of the Lung

    NOTES :  A Model of Gas Exchange for Hyperpolarized Xe(129) Magnetic Resonance of the Lung  背景知识: Ga ...

  2. bzoj 3778: 共鸣【计算几何+dp】

    枚举起点,然后设f[i][j]为上凸壳上一个点是i当前点是j的最大面积,g是下凸壳,然后合并的时候枚举结束点t合并上下凸壳即可 这样的好处是每次转移都是往凸多边形里加一个三角形(s,i,j),所以判断 ...

  3. 2016.03.27,英语,《Vocabulary Builder》Unit 06

    equ: from Latin aequus, meaning 'equal', equalize:使相等; equivalent:[ɪ'kwɪvələnt], A is equivalent to ...

  4. DDD 领域驱动设计-看我如何应对业务需求变化,愚蠢的应对?

    写在前面 阅读目录: 具体业务场景 业务需求变化 "愚蠢"的应对 消息列表实现 消息详情页实现 消息发送.回复.销毁等实现 回到原点的一些思考 业务需求变化,领域模型变化了吗? 对 ...

  5. Java 进阶 hello world! - 中级程序员之路

    Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...

  6. shell之sort命令

    1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ...

  7. iOS实现UITableViewDataSource与Controller的分离

    写在前面 在之前的项目中好多处用到了tableView,然而之前不懂得将代理方法实现分离,所以每在一处用到tableView就要在controller中写一遍UITableViewDataSource ...

  8. IOC框架

    一. IOC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...

  9. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...

随机推荐

  1. Unity的sendmessage用法

    刚学完sendmessage用法,自己也尝试测试了一下,用法如下: 1.在unity2017新建一个场景test 2.在场景中添加一个立方体cube作为主角,另添加一个胶囊体capsule,调整为如图 ...

  2. Vue之Vue-touch的使用

    最近项目中,有的页面发现设置返回键看起来怪怪的,感觉与整体不协调,于是就考虑使用手势滑动事件来实现返回功能~ 开叉查阅资料~找到了vue-touch,使用起来可谓是简单粗暴啊,适合我这样的快速开发人员 ...

  3. nginx 如何配置来获取用户真实IP

  4. linux替换yum源及配置本地源

    linux系统安装后自带的bash源由于在国外,安装软件包的时候会非常慢,最好替换一下yum源. ​关于yum源的简单介绍 ​           yum的主要功能是更方便地添加,删除和更新rpmba ...

  5. python 正则表达式与JSON字符串

    目录 正则表达式 概括单字符集 匹配单字符 匹配字符集 普通字符与元字符 元字符和普通的字符的混用 数量词{整数|*|+|?} 匹配指规则的字母 贪婪模式 匹配指定长度的字符串 非贪婪模式 匹配指定长 ...

  6. Head First Python (一)

    建立一个数组: cast = ["Cleese","Palin","Jones","Idle"] 列出数组有多少数据项: ...

  7. POJ:2492-Bug's Life(二分图的判定)

    Bug's Life Time Limit: 10000MS Memory Limit: 65536K Description Background Professor Hopper is resea ...

  8. [Hdu3507]Print Article(斜率优化)

    Description 题意:给N个数,按顺序全部取走,每次取一段连续的区间,代价为\((S[i]-S[j])^2+M\) 其中M为一个给定的常数,\(S[i]\)为前缀和 \(N\leq 50000 ...

  9. 2018年湘潭大学程序设计竞赛 E 吃货

    题目描述 作为一个标准的吃货,mostshy又打算去联建商业街觅食了.混迹于商业街已久,mostshy已经知道了商业街的所有美食与其价格,而且他给每种美食都赋予了一个美味度,美味度越高表示他越喜爱这种 ...

  10. Js中的假值_ES5中定义的ToBoolean方法强制类型转换后值为false

    你不知道的Javascript(中)--ToBoolean javascript中的值可以分为以下两类: 1.可以被强制类型转换为false的值 2.其他(被强制类型转换为true的值) 假值---以 ...