fafu 1413
叉积的运用 ,不断的用叉积去判断 最小的拼图, 刚开始对点进行排序,每个人的排序规则不同做法可能不同,我是按照点的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的更多相关文章
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
- BZOJ 1413 取石子游戏(DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1413 题意:n堆石子排成一排.每次只能在两侧的两堆中选择一堆拿.至少拿一个.谁不能操作谁 ...
- 51nod 1413 权势二进制 背包dp
1413 权势二进制 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成.例如0,1,101, ...
- FAFU 1395
动态规划:...翻牌FAFU 1395 动态规划
- FAFU 1136 最长递增子序列
http://acm.fafu.edu.cn/problem.php?id=1136 根据dp建边,建边的时候记得判断如果原本数的大小就ok了 好久没在自家OJ上刷了 #include <ios ...
- #1413 : Rikka with String 后缀自动机 + 二级差分
http://hihocoder.com/problemset/problem/1413?sid=1199641 这题断断续续做了2个多星期吧,一直不会 设总答案为sum,替换后新加的子串数量为x,失 ...
- 51nod 1413 权势二进制【进制思维】
1413 权势二进制 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 一个十进制整数被叫做权势二进制,当他的十进制 ...
- hdu 1413 文件系统
hdu 1413 文件系统 题目链接:pid=1413" target="_blank">http://acm.hdu.edu.cn/sho ...
- bzoj 1413 [ZJOI2009]取石子游戏
1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 747 Solved: 490[Submit][Statu ...
随机推荐
- Spring Boot 商城项目
Spring Boot 商城项目 angularJS Demo1 <html> <head> <title>angularJS Demo1</title> ...
- vue--使用过滤器
有个项目需要可以添加和删除选项,但是左侧要显示的 A,B,C,D.... 解决思路: 循环的时候
- Spark2 DataSet 创建新行之flatMap
val dfList = List(("Hadoop", "Java,SQL,Hive,HBase,MySQL"), ("Spark", & ...
- 远程服务器git搭建
在远程服务器如:/var/www下创建hello.git 然后git init --bare hello.git cd hello.git会看到下面的目录和文件 然后创建可以访问git的用户 git ...
- poj1066 Treasure Hunt【计算几何】
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8192 Accepted: 3376 Des ...
- IntelliJ IDEA学习记录
一.下载 地址:官网下载地址 二.安装 运行安装程序,一路下一步.注意选择安装路径. 三.基本概念 project:相当于donet中的解决方案(solution),eclipse中的工作空间(wor ...
- Freemarker 基本数据类型
一 数据类型简介 freemarker 模板中的数据类型由如下几种: 1. 布尔型:等价于java中的boolean类型, 不同的是不能直接输出,可以转换成字符串再输出 2. 日期型:等价于java中 ...
- POJ_3186_Treats for the Cows
Treats for the Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6568 Accepted: 34 ...
- CVPixelBuffer
https://www.cnblogs.com/psklf/p/7700834.html https://stackoverflow.com/questions/16475737/convert-ui ...
- Constructing Roads----poj2421(最小生成树Kruskal)
题目链接: http://poj.org/problem?id=2421 想把n个村庄连接在一起:求最小生成树,不同的是已经有了m条线段链接在一起了,求剩下的: 感觉用Kruskal会简单一点 #in ...