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 ...
随机推荐
- 使用nginx做反代时遇到413 Request Entity Too Large的解决方法
在使用nginx做反向代理的时候,被反代的系统在上传文件的时候遇到413 错误 :Request Entity Too Large 原因是nginx限制了上传文件的大小,在nginx中可以配置最大允许 ...
- [心跳] 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连
此文讲述的内容是一个实际项目开发中的一部分内容,笔者将亲身经历写成文章. [背景] 现 需要实现这样的功能:有多个客户端连着同一个服务器.服务器和客户端之间需要“互相”知道彼此的连接状态.比如在某一时 ...
- shell脚本中对简单实现对log的处理
用shell在写小程序时,log没用像python样用logging模块可以直接使用,下面我们就简单写下用shell函数来实现log分级 #/bin/bash sys_log="/var/l ...
- ABP之创建实体
ABP框架是一个非常庞大的框架,里面的东西有很多,那么如果我需要使用ABP进行项目的开发,具体的使用流程是怎样的呢?接下来将以一个简单的电影票管理“系统”为例子具体的实现一下. 一. 实体的创建 实体 ...
- CTP API开发之一:CTP API简介
官网下载CTP API 综合交易平台CTP(Comprehensive Transaction Platform)是由上海期货信息技术有限公司(上海期货交易所的全资子公司)开发的期货交易平台,CTP平 ...
- python中的字符串切片
python中的字符串切片,似乎有点乱,例如: >>>pystr='Python' >>>pystr[2:5] 就会输出 'tho' 这该怎样理解呢?中括号[2:5 ...
- 洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心
正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5, ...
- ansible-playbook剧本
Playbooks 是一种简单的配置管理系统与多机器部署系统的基础, 非常适合于复杂应用的部署 由 yaml 语言编写, 运行过程中, ansible-playbook 命令根据自上而下的顺序依次执行 ...
- java string.getBytes(“UTF-8”) javascript equivalent
1. byte[] bytes = "test.message".getBytes("UTF-8"); //result: [116, 101, 115, 11 ...
- Python3学习之路~2.6 集合操作
集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作 >>> list1 = ...