叉积的运用 ,不断的用叉积去判断 最小的拼图, 刚开始对点进行排序,每个人的排序规则不同做法可能不同,我是按照点的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. Jdk提供的动态代理示例

    package com.jiaoyiping.util.demo; import java.lang.reflect.InvocationHandler; import java.lang.refle ...

  2. CENTOS安装ElasticSearch

    原文链接:https://my.oschina.net/topeagle/blog/591451?fromerr=mzOr2qzZ CENTOS安装ElasticSearch ElasticSearc ...

  3. 【CF896E】Welcome home, Chtholly 暴力+分块+链表

    [CF896E]Welcome home, Chtholly 题意:一个长度为n的序列ai,让你支持两种操作: 1.l r x:将[l,r]中ai>x的ai都减去x.2.l r x:询问[l,r ...

  4. mock server搭建及接口测试简单实例

    一.搭建mock server mock工具很多,这里我们选择用简单易操作的moco服务器 使用前必须先安装java,去相关网站下载Standalone Moco Runner 二.使用mock se ...

  5. Java.Util.List(List接口)

    equals方法 equals(Object o) 方法用来比较指定的对象与列表是否相等,当且仅当指定的对象也是一个列表.两个列表有相同的大小,并且两个列表中的所有相应的元素对相等时才返回 true. ...

  6. Java String, StringBuffer和StringBuilder实例

    1- 分层继承2- 可变和不可变的概念3- String3.1- 字符串是一个非常特殊的类3.2- String 字面值 vs. String对象3.3- String的方法3.3.1- length ...

  7. Sublime2或3配置R、Scala、Python交互式环境

    1.Sublime3的下载地址:http://www.sublimetext.com/3 2.刚刚安装的软件是没有PackageControl的,需要在新安装使用 (1)   以前没有安装过Packa ...

  8. POJ 2653 - Pick-up sticks - [枚举+判断线段相交]

    题目链接:http://poj.org/problem?id=2653 Time Limit: 3000MS Memory Limit: 65536K Description Stan has n s ...

  9. android stream media

    http://www.cnblogs.com/skyseraph/archive/2012/03/31/2427593.html http://www.cnblogs.com/lingyunhu/p/ ...

  10. Frogger--poj2253

    http://poj.org/problem?id=2253 题意:The frog distance (humans also call it minimax distance) between t ...