叉积的运用 ,不断的用叉积去判断 最小的拼图, 刚开始对点进行排序,每个人的排序规则不同做法可能不同,我是按照点的x轴进行x轴相同用y小的在前面,然后每个点按照最下的点开始进行查找 每次从一个点出发然后结束后无论找不找到都得 将出发的那条边删掉,ok然后就可以不断的去瓜分这张大的图,

#include <iostream>
#include <cstdio>
#include<string.h>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
struct point
{
double x,y;
point(double a=0,double b=0)
{x=a;y=b;}
}node[1500],tong[1500];
struct line
{
point p1,p2;
}L[1005];
point operator -(point a,point b){ return point(a.x-b.x,a.y-b.y); }
bool operator <(const point &a,const point &b)
{ return a.x<b.x||(a.x==b.x&&a.y<b.y);}
bool operator ==(const point &a,const point &b){ return a.x==b.x&&a.y==b.y; }
int n,sum,num[1500],ct;
double A[1500];
bool mark[1500];
int vis[1500];
bool cmp(point a,point b)
{return a.x<b.x||(a.x==b.x&&a.y<b.y);}
map<point,int>P;
vector<int>F[1500];
double area(int T)
{
double sum=0;
tong[T]=tong[0];
for(int i=0;i<T;i++)
sum+=tong[i].x*tong[i+1].y-tong[i].y*tong[i+1].x;
if(sum>0) return sum/2;
else return -sum/2;
}
void shifang(int a,int b)
{
int i,ll,N;N=F[a].size();
for(i=0;i<N;i++)
{ ll=F[a][i];
if(ll==b) break;
}
F[a].erase(F[a].begin()+i);
N=F[b].size();
for(i=0;i<N;i++)
{
ll=F[b][i];
if(ll==a)
break;
}
F[b].erase(F[b].begin()+i);
}
double cross(point a,point b){return a.x*b.y-a.y*b.x;}
int look(int fa,int now,int nu)
{ if(vis[now]==2&&mark[now]) return nu;
tong[nu]=node[now]; point gh[1000],p1=node[now],p2=node[now];
int a=0,i,nut=0,T=0; bool k1,k2; k1=k2=false;
if(vis[now]) a=1;
for(i=0;i<F[now].size();i++)
{
int ll=F[now][i];
if((vis[ll]==0||a==0)&&mark[ll]&&ll!=fa)
{ gh[nut++]=node[ll];
}
}
for(i=0;i<nut;i++)
if(cross(node[now]-node[fa],gh[i]-node[fa])>=0)
{
if(cross(gh[i]-node[now],p1-node[now])<0||p1==node[now])
{ p1=gh[i]; k1=1;}
}
else
{
if(p2==node[now]||cross(p2-node[now],gh[i]-node[now])>0)
{p2=gh[i]; k2=1; }
} vis[now]=1;
if(!(p1==node[now])||k1)
{
int ll=P[p1] ;
T=look(now,ll,nu+1);
}
else if(!(p2==node[now])||k2){
int ll=P[p2];
T=look(now,ll,nu+1);
}
vis[now]=0;
return T;
}
point G;
bool cmp1(point a,point b)
{
point ll=G;
return cross(a-ll,b-ll)>=0;
}
bool cmp2(point a,point b)
{
return a.y<b.y||(a.y==b.y&&a.x<=b.x);
}
void work()
{
int k,j,i,T;
point pp[1500];
for(i=0;i<sum;i++)
{
G=node[i];
int a=P[node[i]];
vis[a]=2;
for(k=0;k<F[a].size();k++)
pp[k]=node[F[a][k]];
sort(pp,pp+k,cmp2);
sort(pp,pp+k,cmp1);
for(j=0;j<k;j++)
{
tong[0]=node[a];
int gg=P[pp[j]];
if((T=look(a,gg,1)))
{
A[ct++]=area(T);
// for(int kk=0;kk<T;kk++)
// printf("%.3lf %.3lf ",tong[kk].x,tong[kk ].y);
//printf("\n\n");
}
shifang(a,gg);
}
vis[a]=1;
mark[a]=false;
}
}
int main()
{
point t1,t2;
int i,a,b,f=0;
//freopen("data.txt","r",stdin);
while(scanf("%d",&n)==1)
{ if(f)puts("");f=1;
P.clear();
ct=0;
memset(mark,true,sizeof(mark));memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis));
for(i=0;i<1500;i++)
F[i].clear();
sum=0;
for(i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&L[i].p1.x,&L[i].p1.y,&L[i].p2.x,&L[i].p2.y);
a=P[L[i].p1];
b=P[L[i].p2];
if(a==0)
{node[sum++]=L[i].p1; a=P[L[i].p1]=sum;}
if(b==0)
{ node[sum++]=L[i].p2;b=P[L[i].p2]=sum;}
}
P.clear();
sort(node,node+sum,cmp);
for(i=0;i<sum;i++)
P[node[i]]=i;
for(i=0;i<n;i++)
{
a=P[L[i].p1];b=P[L[i].p2];
F[a].push_back(b);
F[b].push_back(a);
}
work();
sort(A,A+ct);
for(i=0;i<ct;i++)
printf("%.2lf\n",A[i]);
P.clear();
}
return 0;
}

fafu 1413的更多相关文章

  1. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

  2. BZOJ 1413 取石子游戏(DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1413 题意:n堆石子排成一排.每次只能在两侧的两堆中选择一堆拿.至少拿一个.谁不能操作谁 ...

  3. 51nod 1413 权势二进制 背包dp

    1413 权势二进制 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB  一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成.例如0,1,101, ...

  4. FAFU 1395

    动态规划:...翻牌FAFU 1395 动态规划

  5. FAFU 1136 最长递增子序列

    http://acm.fafu.edu.cn/problem.php?id=1136 根据dp建边,建边的时候记得判断如果原本数的大小就ok了 好久没在自家OJ上刷了 #include <ios ...

  6. #1413 : Rikka with String 后缀自动机 + 二级差分

    http://hihocoder.com/problemset/problem/1413?sid=1199641 这题断断续续做了2个多星期吧,一直不会 设总答案为sum,替换后新加的子串数量为x,失 ...

  7. 51nod 1413 权势二进制【进制思维】

    1413 权势二进制 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 一个十进制整数被叫做权势二进制,当他的十进制 ...

  8. hdu 1413 文件系统

    hdu   1413   文件系统         题目链接:pid=1413" target="_blank">http://acm.hdu.edu.cn/sho ...

  9. bzoj 1413 [ZJOI2009]取石子游戏

    1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 747  Solved: 490[Submit][Statu ...

随机推荐

  1. matlab中 数据保留有效位数

    可以使用round函数  ,这函数原本功能是四舍五入 比如: >> A = 0.0326465;>> B = round(A*1000)/1000 B = 0.0330

  2. H3C系列之三层交换机文件管理

    笔者本篇文章所用h3c交换机的型号为三层交换机S3600-28TP-SI 对于文件的操作一般都在用户视图下操作,常见的有如下一些操作: 1.查看操作,常用的查看操作可以使用如下命令: <H3C& ...

  3. python nose测试框架全面介绍四

    四.内部插件介绍 1.Attrib 标记,用于筛选用例 在很多时候,用例可以分不同的等级来运行,在nose中很增加了这个功能,使用attrib将用例进行划分 有两种方式: ef test_big_do ...

  4. Java秒杀简单设计一:搭建springboot环境

    项目参考:慕课网  https://www.imooc.com/learn/587 Java秒杀 开发环境 JDK1.8.Maven.Mysql.Eclipse.SpringBoot2.0.5.myb ...

  5. Thinkphp框架下设置session的过期时间

    打开项目中的配置文件,添加session的过期配置,如下: 'SESSION_OPTIONS' => array( 'name' => 'BJYSESSION', //设置session名 ...

  6. mysql if判断

    select if(SUBSTR('06622200556',1,2)='06',0,1) from t_member_product_adb limit 2 输出结果为:0,0

  7. mysql语句性能分析

    1.开启慢查询 slow_query_log = 1 //开启 slow_query_log_file = mysql_slow_query.log //日志文件位置 long_query_time ...

  8. MPD大会北京上海两站圆满落幕

    MPD大会北京上海两站圆满落幕 由麦思博(MSUP)主办的亚太软件研发团队管理峰会(以下简称MPD大会)分别于6月15及6月22日在北京.上海成功举办.国内外知名软件.互联网行业项目领头人及业内从业人 ...

  9. java基础解析系列(六)---注解原理及使用

    java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及 ...

  10. Oracle 分析函数的使用(主要是rollup用法)

    分析函数是oracle 8.1.6中就引入的一个全新的概念,为我们分析数据提供了一种简单高效的处理方式.在分析函数出现以前,我们必须使用自联查询,子查询或者内联视图,甚至复杂的存储过程实现的语句,现在 ...