叉积的运用 ,不断的用叉积去判断 最小的拼图, 刚开始对点进行排序,每个人的排序规则不同做法可能不同,我是按照点的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. Windows下Visual Studio 2013编译Lua 5.2.3

    1.创建一个Visual C++的Empty Project,如果需要支持Windows XP将Platform Toolset设置为Visual Studio 2013 - Windows XP ( ...

  2. Docker Compose 版本过高(Docker版本不匹配),降低docker-compose版本

    通过docker-compose启动容器,报错: ERROR: The Docker Engine version is less than the minimum required by Compo ...

  3. 【CF891E】Lust 生成函数

    [CF891E]Lust 题意:给你一个长度为n的序列$a_i$,对这个序列进行k次操作,每次随机选择一个1到n的数x,令$res+=\prod\limits_{i!=x}a_i$(一开始res=0) ...

  4. python WEB UI自动化在日期框中动态输入当前日期

    要在日期框中输入当前日期,如下图 代码为 本想用最简单的方法,直接用sendkeys发送当前日期,如下: current_time=time.strftime('%Y-%m-%d',time.loca ...

  5. 画面渲染:实时渲染(Real-time Rendering)、离线渲染(Offline Rendering)[转]

    实时渲染(Real-time Rendering) 实时渲染的本质就是图形数据的实时计算和输出.最典型的图形数据源是顶点.顶点包括了位置.法向.颜色.纹理坐标.顶点的权重等.在第一代渲染技术中(198 ...

  6. vsftpd java程序无法创建和切换目录

    # Example config file /etc/vsftpd/vsftpd.conf # # The default compiled in settings are fairly parano ...

  7. python---使用md5加密

    python中使用md5进行加密字符串: __author__ = 'Administrator' #-*- coding: utf-8 -*- import hashlib aa = ' #需要加密 ...

  8. Spark2 Dataset持久化存储级别StorageLevel

    import org.apache.spark.storage.StorageLevel // 数据持久缓存到内存中//data.cache()data.persist() // 设置缓存级别data ...

  9. 关于jquery的css的一些知识

    Query实例CSS 样式表动态选择本实例主要说的还是jquery的选择器,关于jquery的css的一些知识用类似 $("li").css("cursor", ...

  10. PHP 正则表达式抓取网页内容。

    我想用php抓取爱奇艺生活类型视频网页里面的元素,应该如何去做呢? 首先我要非常熟悉正则表达式,关于正则表达式的学习,我会写一篇博客一直学习的. 直接举例子: 这是一个爱奇艺生活视频的界面的网址 $u ...