[关闭]
@994495jj 2017-08-14T11:30:32.000000Z 字数 1814 阅读 704

cfgym100253C

201708 (ACM)几何


题意

题解

注意

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define mp make_pair
  6. #define pb push_back
  7. #define sz(a) (int)a.size()
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<" = "<<a<<endl
  10. #define x(a) a.x
  11. #define y(a) a.y
  12. typedef long long ll;
  13. typedef double db;
  14. typedef pair<int, int> pii;
  15. typedef vector<int> vi;
  16. //----
  17. const int N=105;
  18. const db eps=1e-5;
  19. int sign(db x) {
  20. return (x>eps)-(x<-eps);
  21. }
  22. int n;
  23. int pre[N];
  24. db x[N],y[N],z[N];
  25. struct P {
  26. db x,y;
  27. P() {}
  28. P(db x, db y) {
  29. this -> x = x;
  30. this -> y = y;
  31. }
  32. P operator + (const P &c) const {
  33. return P(x + c.x, y + c.y);
  34. }
  35. P operator - (const P &c) const {
  36. return P(x - c.x, y - c.y);
  37. }
  38. };
  39. struct S {
  40. int r;
  41. P a[2],b[2],c[6][6];
  42. }ss[N];
  43. P read() {
  44. db x,y;scanf("%lf%lf",&x,&y);
  45. return P(x,y);
  46. }
  47. db abs(P a) {
  48. return sqrt(x(a) * x(a) + y(a) * y(a));
  49. }
  50. db cross(P a, P b) {
  51. return x(a) * y(b) - x(b) * y(a);
  52. }
  53. int find(int x) {
  54. if(x==pre[x]) return x;
  55. return pre[x]=find(pre[x]);
  56. }
  57. void join(int x,int y) {
  58. int fx=find(x),fy=find(y);
  59. pre[fx]=fy;
  60. }
  61. void gao(int u) {
  62. S &t = ss[u];
  63. db a=abs(t.a[0]-t.a[1]);
  64. db b=abs(t.b[0]-t.b[1]);
  65. y[u]=a*b;
  66. rep(i,0,t.r) {
  67. x[u]=x[u]+fabs(cross(t.c[i][0]-t.c[i][1], t.c[i][2]-t.c[i][1]));
  68. }
  69. z[u]=x[u]/y[u];
  70. }
  71. bool eq(int u,int v) {
  72. return sign(z[u]-z[v])==0;
  73. }
  74. int main(){
  75. ///
  76. scanf("%d",&n);
  77. ///init
  78. rep(i,0,n+1) pre[i]=i;
  79. ///read
  80. rep(i,1,n+1) {
  81. ss[i].a[0]=read();
  82. ss[i].a[1]=read();
  83. ss[i].b[0]=read();
  84. ss[i].b[1]=read();
  85. scanf("%d",&ss[i].r);
  86. rep(j,0,ss[i].r) {
  87. rep(k,0,4) {
  88. ss[i].c[j][k]=read();
  89. }
  90. }
  91. }
  92. ///solve
  93. rep(i,1,n+1) gao(i);
  94. rep(i,1,n+1) {
  95. rep(j,i+1,n+1) {
  96. if(eq(i,j)) join(i,j);
  97. }
  98. }
  99. ///print
  100. rep(i,1,n+1) printf("%d%c",find(i),(i==n)?'\n':' ');
  101. return 0;
  102. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注