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

  1. #include <iostream>
  2. #include <cstdio>
  3. #include<string.h>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<map>
  7. #include<vector>
  8. using namespace std;
  9. struct point
  10. {
  11. double x,y;
  12. point(double a=0,double b=0)
  13. {x=a;y=b;}
  14. }node[1500],tong[1500];
  15. struct line
  16. {
  17. point p1,p2;
  18. }L[1005];
  19. point operator -(point a,point b){ return point(a.x-b.x,a.y-b.y); }
  20. bool operator <(const point &a,const point &b)
  21. { return a.x<b.x||(a.x==b.x&&a.y<b.y);}
  22. bool operator ==(const point &a,const point &b){ return a.x==b.x&&a.y==b.y; }
  23. int n,sum,num[1500],ct;
  24. double A[1500];
  25. bool mark[1500];
  26. int vis[1500];
  27. bool cmp(point a,point b)
  28. {return a.x<b.x||(a.x==b.x&&a.y<b.y);}
  29. map<point,int>P;
  30. vector<int>F[1500];
  31. double area(int T)
  32. {
  33. double sum=0;
  34. tong[T]=tong[0];
  35. for(int i=0;i<T;i++)
  36. sum+=tong[i].x*tong[i+1].y-tong[i].y*tong[i+1].x;
  37. if(sum>0) return sum/2;
  38. else return -sum/2;
  39. }
  40. void shifang(int a,int b)
  41. {
  42. int i,ll,N;N=F[a].size();
  43. for(i=0;i<N;i++)
  44. { ll=F[a][i];
  45. if(ll==b) break;
  46. }
  47. F[a].erase(F[a].begin()+i);
  48. N=F[b].size();
  49. for(i=0;i<N;i++)
  50. {
  51. ll=F[b][i];
  52. if(ll==a)
  53. break;
  54. }
  55. F[b].erase(F[b].begin()+i);
  56. }
  57. double cross(point a,point b){return a.x*b.y-a.y*b.x;}
  58. int look(int fa,int now,int nu)
  59. {
  60.  
  61. if(vis[now]==2&&mark[now]) return nu;
  62. tong[nu]=node[now];
  63.  
  64. point gh[1000],p1=node[now],p2=node[now];
  65. int a=0,i,nut=0,T=0; bool k1,k2; k1=k2=false;
  66. if(vis[now]) a=1;
  67. for(i=0;i<F[now].size();i++)
  68. {
  69. int ll=F[now][i];
  70. if((vis[ll]==0||a==0)&&mark[ll]&&ll!=fa)
  71. {
  72.  
  73. gh[nut++]=node[ll];
  74. }
  75. }
  76. for(i=0;i<nut;i++)
  77. if(cross(node[now]-node[fa],gh[i]-node[fa])>=0)
  78. {
  79. if(cross(gh[i]-node[now],p1-node[now])<0||p1==node[now])
  80. { p1=gh[i]; k1=1;}
  81. }
  82. else
  83. {
  84. if(p2==node[now]||cross(p2-node[now],gh[i]-node[now])>0)
  85. {p2=gh[i]; k2=1; }
  86. }
  87.  
  88. vis[now]=1;
  89. if(!(p1==node[now])||k1)
  90. {
  91. int ll=P[p1] ;
  92. T=look(now,ll,nu+1);
  93. }
  94. else if(!(p2==node[now])||k2){
  95. int ll=P[p2];
  96. T=look(now,ll,nu+1);
  97. }
  98. vis[now]=0;
  99. return T;
  100. }
  101. point G;
  102. bool cmp1(point a,point b)
  103. {
  104. point ll=G;
  105. return cross(a-ll,b-ll)>=0;
  106. }
  107. bool cmp2(point a,point b)
  108. {
  109. return a.y<b.y||(a.y==b.y&&a.x<=b.x);
  110. }
  111. void work()
  112. {
  113. int k,j,i,T;
  114. point pp[1500];
  115. for(i=0;i<sum;i++)
  116. {
  117. G=node[i];
  118. int a=P[node[i]];
  119. vis[a]=2;
  120. for(k=0;k<F[a].size();k++)
  121. pp[k]=node[F[a][k]];
  122. sort(pp,pp+k,cmp2);
  123. sort(pp,pp+k,cmp1);
  124. for(j=0;j<k;j++)
  125. {
  126. tong[0]=node[a];
  127. int gg=P[pp[j]];
  128. if((T=look(a,gg,1)))
  129. {
  130. A[ct++]=area(T);
  131. // for(int kk=0;kk<T;kk++)
  132. // printf("%.3lf %.3lf ",tong[kk].x,tong[kk ].y);
  133. //printf("\n\n");
  134. }
  135. shifang(a,gg);
  136. }
  137. vis[a]=1;
  138. mark[a]=false;
  139. }
  140. }
  141. int main()
  142. {
  143. point t1,t2;
  144. int i,a,b,f=0;
  145. //freopen("data.txt","r",stdin);
  146. while(scanf("%d",&n)==1)
  147. {
  148.  
  149. if(f)puts("");f=1;
  150. P.clear();
  151. ct=0;
  152. memset(mark,true,sizeof(mark));memset(num,0,sizeof(num));
  153. memset(vis,0,sizeof(vis));
  154. for(i=0;i<1500;i++)
  155. F[i].clear();
  156. sum=0;
  157. for(i=0;i<n;i++)
  158. {
  159. scanf("%lf%lf%lf%lf",&L[i].p1.x,&L[i].p1.y,&L[i].p2.x,&L[i].p2.y);
  160. a=P[L[i].p1];
  161. b=P[L[i].p2];
  162. if(a==0)
  163. {node[sum++]=L[i].p1; a=P[L[i].p1]=sum;}
  164. if(b==0)
  165. { node[sum++]=L[i].p2;b=P[L[i].p2]=sum;}
  166. }
  167. P.clear();
  168. sort(node,node+sum,cmp);
  169. for(i=0;i<sum;i++)
  170. P[node[i]]=i;
  171. for(i=0;i<n;i++)
  172. {
  173. a=P[L[i].p1];b=P[L[i].p2];
  174. F[a].push_back(b);
  175. F[b].push_back(a);
  176. }
  177. work();
  178. sort(A,A+ct);
  179. for(i=0;i<ct;i++)
  180. printf("%.2lf\n",A[i]);
  181. P.clear();
  182. }
  183. return 0;
  184. }

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. CreateTimerQueueTimer在DllMain中调用导致的loader lock

    开发一个COM组件在Windows 7上注册成功,但是Windows XP SP3版本却导致regsvr32.exe进程挂起.用WinDbg查看发现提示: Break- seconds... WARN ...

  2. svn和git的优缺点

    git官网api: https://git-scm.com/docs 一. 集中式vs分布式 1. Subversion属于集中式的版本控制系统集中式的版本控制系统都有一个单一的集中管理的服务器,保存 ...

  3. css 多行文字,超出部分隐藏,...代替

    css虽然简单,但其实也是记得常用的那些,不常用的还是要搜一搜再写

  4. poj1743 Musical Theme【后缀数组】【二分】

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 35044   Accepted: 11628 D ...

  5. XTU 1267 - Highway - [树的直径][2017湘潭邀请赛H题(江苏省赛)]

    这道题可能有毒……总之一会儿能过一会儿不能过的,搞的我很心烦…… 依然是上次2017江苏省赛的题目,之前期末考试结束了之后有想补一下这道题,当时比较懵逼不知道怎么做……看了题解也不是很懂……就只好放弃 ...

  6. php安装redis扩展'checking for igbinary includes... configure: error: Cannot find igbinary.h'解决方法

    今天准备给yii2安装redis扩展,先安装了redis服务,然后安装redis php官方扩展,在make的时候提示' checking for igbinary includes... confi ...

  7. JMeter(十)-正则表达式关联

    jmeter中,接口自动化的关键在于参数关联.比如需要登录的接口,如何调用登录口令?一个增删改查的闭环,如何将接口参数上下传递?下面就以实际的例子来仔细说一说 1:登录接口 这里有一个实际的登录接口, ...

  8. elasticsearch的重启

    没有重启的操作,只有关闭了再启动的操作. ps -ef | grep elastic e表示全部的进程,f表示展示进程间的相关关系,如父子进程. 然后找到你启动es的那个账号,不是root,一般是新建 ...

  9. Python开发【笔记】:关于子线程(子进程)与主线程(主进程)的关联

    前言: 主要分析下面的问题: 主线程启线程  主线程执行完毕,会关闭子线程吗? 子线程启线程  主线程执行完毕,会结束吗? 主进程启动进程,主进程执行完毕,会怎样? 子进程启动进程,进程执行完毕,又会 ...

  10. Python开发【笔记】:pymsyql 插入一条数据同时获取新插数据的自增id的两种方式

    一.通过cursor.lastrowid import pymysql.cursors # Connect to the database connection = pymysql.connect(h ...