思路:转换成n条三维空间的直线,求最大的集合使得两两有交点。

有两种情况:第一种是以某2条直线为平面,这时候只要统计这个平面上有几条斜率不同的直线就可以了

还有一种是全部交于同一点,这个也只要判断就可以了。

然后我并不能改出来,wa了好多个点

WA的程序:

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define dou long double
  7. const dou eps=1e-;
  8. int n;
  9. struct Point{
  10. dou x,y,z;
  11. Point(){}
  12. Point(dou x0,dou y0,dou z0):x(x0),y(y0),z(z0){}
  13. };
  14. struct Line{
  15. Point s,e,p;
  16. int id;
  17. Line(){}
  18. Line(Point s0,Point e0):s(s0),e(e0){}
  19. }l[];
  20. int tmp[];
  21. int read(){
  22. int t=,f=;char ch=getchar();
  23. while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
  24. while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
  25. return t*f;
  26. }
  27. bool cmp(Line l1,Line l2){
  28. Point p1=l1.p,p2=l2.p;
  29. if (fabs(p1.x-p2.x)<eps&&fabs(p1.y-p2.y)<eps) return p1.z<p2.z;
  30. else
  31. if (fabs(p1.x-p2.x)<eps) return p1.y<p2.y;
  32. return p1.x<p2.x;
  33. }
  34. bool operator ==(Point p1,Point p2){
  35. return fabs(p1.x-p2.x)<=eps&&fabs(p1.y-p2.y)<=eps&&fabs(p1.z-p2.z)<=eps;
  36. }
  37. bool operator !=(Point p1,Point p2){
  38. if (p1==p2) return ;
  39. else return ;
  40. }
  41. double operator /(Point p1,Point p2){
  42. return p1.x*p2.x+p1.y*p2.y+p1.z*p2.z;
  43. }
  44. Point operator -(Point p1,Point p2){
  45. return Point(p1.x-p2.x,p1.y-p2.y,p1.z-p2.z);
  46. }
  47. Point operator *(Point p1,Point p2){
  48. return Point(p1.y*p2.z-p1.z*p2.y,p1.z*p2.x-p1.x*p2.z,p1.x*p2.y-p1.y*p2.x);
  49. }
  50. Point operator /(Point p1,dou x){
  51. return Point(p1.x/x,p1.y/x,p1.z/x);
  52. }
  53. dou sqr(dou x){
  54. return x*x;
  55. }
  56. dou dist(Point p){
  57. return sqrt(sqr(p.x)+sqr(p.y)+sqr(p.z));
  58. }
  59. dou dist(Point p1,Point p2){
  60. return dist(p1-p2);
  61. }
  62. bool zero(dou x){
  63. if (fabs(x)<eps) return ;
  64. return ;
  65. }
  66. bool zero(Point p){
  67. return zero(p.x)&&zero(p.y)&&zero(p.z);
  68. }
  69. bool LineIntersect(Line p1, Line p2){
  70. dou x1=p1.s.x,x2=p1.e.x,x3=p2.s.x,x4=p2.e.x;
  71. dou y1=p1.s.y,y2=p1.e.y,y3=p2.s.y,y4=p2.e.y;
  72. dou z1=p1.s.z,z2=p1.e.z,z3=p2.s.z,z4=p2.e.z;
  73. dou x12=(x1-x2),x13=(x1-x3),x34=(x3-x4);
  74. dou y12=(y1-y2),y13=(y1-y3),y34=(y3-y4);
  75. dou z12=(z1-z2);
  76. dou t=(y34*x12-x34*y12);
  77. if (fabs(t)<eps) return ;
  78. return ;
  79. }
  80. Point inter(Line p1,Line p2){
  81. dou x1=p1.s.x,x2=p1.e.x,x3=p2.s.x,x4=p2.e.x;
  82. dou y1=p1.s.y,y2=p1.e.y,y3=p2.s.y,y4=p2.e.y;
  83. dou z1=p1.s.z,z2=p1.e.z,z3=p2.s.z,z4=p2.e.z;
  84. dou x12=(x1-x2),x13=(x1-x3),x34=(x3-x4);
  85. dou y12=(y1-y2),y13=(y1-y3),y34=(y3-y4);
  86. dou z12=(z1-z2);
  87. dou t=(y13*x34-y34*x13)/(y34*x12-x34*y12);
  88. dou x=x1+x12*((y13*x34-y34*x13)/(y34*x12-x34*y12));
  89. dou y=y1+y12*t,z=z1+z12*t;
  90. return Point(x,y,z);
  91. }
  92. void solve(){
  93. int ans=;
  94. for (int i=;i<=n;i++){
  95. Point p=l[i].e-l[i].s;
  96. dou len=dist(p);
  97. p=p/len;
  98. l[i].p=p;
  99. }
  100. std::sort(l+,l++n,cmp);
  101. int id=;
  102. l[].id=;
  103. for (int i=;i<=n;i++)
  104. if (l[i].p!=l[i-].p)
  105. l[i].id=++id;
  106. else
  107. l[i].id=id;
  108. for (int i=;i<=n;i++)
  109. for (int j=i+;j<=n;j++)
  110. if (LineIntersect(l[i],l[j])){
  111. Point p=inter(l[i],l[j]);
  112. Point e1=l[i].e-l[i].s,e2=l[j].e-l[j].s;
  113. dou len1=dist(e1),len2=dist(e2);
  114. e1=e1/len1;e2=e2/len2;
  115. dou x1=e1.x,x2=e2.x,y1=e1.y,y2=e2.y,z1=e1.z,z2=e2.z;
  116. dou x=;
  117. dou y=(x2*z1-x1*z2)/(y1*z2-z1*y2);
  118. dou z=(-x1*x-y1*y)/z1;
  119. Point e=Point(x,y,z);
  120. for (int k=;k<=n;k++) tmp[k]=;
  121. tmp[l[i].id]=;tmp[l[j].id]=;
  122. for (int k=;k<=n;k++)
  123. if (k!=i&&k!=j)
  124. if (fabs((l[k].e-l[k].s)/e)<eps&&LineIntersect(l[i],l[k])) tmp[l[k].id]=;
  125. int cnt=;
  126. for (int k=;k<=n;k++) if (tmp[k]) cnt++;
  127. ans=std::max(ans,cnt);
  128. cnt=;
  129. for (int k=;k<=n;k++)
  130. if (k!=i&&k!=j)
  131. if ((inter(l[k],l[i])==p)) cnt++;
  132. ans=std::max(ans,cnt);
  133. }
  134. printf("%d\n",ans);
  135. }
  136. int main(){
  137. freopen("spider.txt","r",stdin);
  138. n=read();
  139. for (int i=;i<=n;i++){
  140. int kx=read(),bx=read(),ky=read(),by=read();
  141. Point p1,p2;
  142. p1.x=-;p1.y=-kx+bx;p1.z=-ky+by;
  143. p2.x=;p2.y=kx+bx;p2.z=ky+by;
  144. l[i]=Line(p1,p2);
  145. }
  146. solve();
  147. }

只好改成std的写法了。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define sz 1020000
  7. #define ll long long int
  8. using namespace std;
  9. int n,ans=;
  10. ll kx[sz],ky[sz],bx[sz],by[sz];
  11. int read(){
  12. int t=,f=;char ch=getchar();
  13. while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
  14. while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
  15. return t*f;
  16. }
  17. ll gcd(ll a,ll b){
  18. if (b==) return a;
  19. else return gcd(b,a%b);
  20. }
  21. bool ok(ll i,ll j,ll &X,ll &Y,ll &T,ll &T2){
  22. if (kx[i] == kx[j]){
  23. if (ky[i] == ky[j]) return ;
  24. T = by[i] - by[j]; T2 = ky[j] - ky[i];
  25. } else{
  26. T = bx[i] - bx[j]; T2 = kx[j] - kx[i];
  27. }
  28. if (kx[i] * T + bx[i] * T2 == kx[j] * T + bx[j] * T2 &&
  29. ky[i] * T + by[i] * T2 == ky[j] * T + by[j] * T2){
  30. X = kx[i] * T + bx[i] * T2;
  31. Y = ky[i] * T + by[i] * T2;
  32. ll g = gcd(gcd(X, Y), gcd(T, T2));
  33. X /= g; Y /= g; T /= g; T2 /= g;
  34.  
  35. return ;
  36. } else return ;
  37. }
  38. void plane(ll i,ll j,ll &A,ll &B,ll &C,ll &D){
  39. if (bx[i]-bx[j]==&&by[i]-by[j]==){
  40. A=ky[i]-ky[j],B=kx[i]-kx[j];
  41. }else{
  42. A=by[i]-by[j],B=bx[i]-bx[j];
  43. }
  44. C=A*kx[i]+B*ky[i];
  45. D=A*bx[i]+B*by[i];
  46. ll g=gcd(gcd(A,B),gcd(C,D));
  47. A/=g;B/=g;C/=g;D/=g;
  48. }
  49. class Hash{
  50. public:
  51. ll F(ll a, ll b, ll c, ll d){
  52. ll s = (a * + b * + c * + d * ) % ;
  53. if (s < ) s = -s;
  54. return s;
  55. }
  56. ll node[], next[sz], A[sz], B[sz], C[sz], D[sz], pass[sz];
  57. ll e;
  58. void ins(ll a,ll b,ll c,ll d){
  59. ll s=F(a,b,c,d);
  60. e++;
  61. next[e]=node[s];node[s]=e;
  62. A[e]=a;B[e]=b;C[e]=c;D[e]=d;
  63. }
  64. bool find(ll a,ll b,ll c,ll d){
  65. ll s=F(a,b,c,d),j;
  66. for (j=node[s];j;j=next[j]){
  67. if (A[j]==a&&B[j]==b&&C[j]==c&&D[j]==d)
  68. return ;
  69. }
  70. return ;
  71. }
  72. }Point,Plane,Slope;
  73. int main(){
  74. freopen("spider.txt","r",stdin);
  75. ll A,B,C,D;
  76. n=read();
  77. for (int i=;i<=n;i++)
  78. kx[i]=read(),bx[i]=read(),ky[i]=read(),by[i]=read();
  79. for (int i=;i<=n;i++)
  80. for (int j=i+;j<=n;j++)
  81. if (ok((ll)i,(ll)j,A,B,C,D)){
  82. if (!Point.find(A,B,C,D)) Point.ins(A,B,C,D);
  83. plane(i,j,A,B,C,D);
  84. if (!Plane.find(A,B,C,D)) Plane.ins(A,B,C,D);
  85. }
  86. for (ll i=;i<=Point.e;i++){
  87. for (ll a=;a<=n;a++){
  88. if (kx[a]*Point.C[i]+bx[a]*Point.D[i]==Point.A[i])
  89. if (ky[a]*Point.C[i]+by[a]*Point.D[i]==Point.B[i])
  90. Point.pass[i]++;
  91. }
  92. }
  93. for (ll i=;i<=Plane.e;i++){
  94. for (ll a=;a<=n;a++){
  95. if (kx[a] * Plane.A[i] + ky[a] * Plane.B[i] == Plane.C[i])
  96. if (bx[a] * Plane.A[i] + by[a] * Plane.B[i] == Plane.D[i])
  97. if (!Slope.find(kx[a],ky[a],i,)){
  98. Plane.pass[i]++;
  99. Slope.ins(kx[a],ky[a],i,);
  100. }
  101. }
  102. }
  103. for (int i=;i<=Point.e;i++)
  104. if (Point.pass[i]>ans) ans=Point.pass[i];
  105. for (int i=;i<=Plane.e;i++)
  106. if (Plane.pass[i]>ans) ans=Plane.pass[i];
  107. printf("%d\n",ans);
  108. }

FJ省队集训DAY2 T1的更多相关文章

  1. FJ省队集训DAY3 T1

    思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分. 因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的 ...

  2. FJ省队集训DAY5 T1

    思路:考试的时候打了LCT,自以为能过,没想到只能过80.. 考完一想:lct的做法点数是100W,就算是nlogn也会T. 讲一下lct的做法把:首先如果一条边连接的两个点都在同一个联通块内,那么这 ...

  3. FJ省队集训DAY4 T1

    直接上题解 #include<cstdio> #include<iostream> #include<cmath> #include<cstring> ...

  4. FJ省队集训DAY2 T2

    思路:我们可以考虑三角剖分,这样问题就变成考虑三角形的选取概率和三角形内有多少个点了. 先用树状数组预处理出三角剖分的三角形中有多少个点,然后用线段树维护,先用原点极角排序,然后枚举i,再以i极角排序 ...

  5. FJ省队集训DAY1 T1

    题意:有一堆兔子,还有一个r为半径的圆,要求找到最大集合满足这个集合里的兔子两两连边的直线不经过圆. 思路:发现如果有两个点之间连边不经过圆,那么他们到圆的切线会构成一段区间,那么这两个点的区间一定会 ...

  6. FJ省队集训DAY4 T3

    #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #inclu ...

  7. FJ省队集训最终测试 T2

    思路:发现如果一个人一共选了x个点,那么选中某一个点对的概率都是一样的,一个人选x个点的总方案是C(n,x),一个人选中某个点对的总方案是C(n-2,x-2),这样,那么选中某个点对的概率就是 x*( ...

  8. FJ省队集训最终测试 T3

    思路:状态压缩dp,f[i][j[[k]代表i行j列这个格子,连续的状态为k,这个连续的状态是什么?就是下图 X格子代表我当前走到的地方,而这里的状态就是红色部分,也就是连续的一段n的状态,我们是分每 ...

  9. FJ省队集训DAY4 T2

    XXX #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #i ...

随机推荐

  1. BZOJ1119: [POI2009]SLO

    1119: [POI2009]SLO Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 379  Solved: 181[Submit][Status] ...

  2. 【细说Java】Java变量初始化顺序

    Java的变量初始化顺序,对这里一直似懂非懂,面试的时候也经常被问到,但答的一直不好,现在整理记录一下,以后忘记了可以来看看. 程序分为两个部分,第一个部分不考虑继承,第二个部分考虑继承: (1)不考 ...

  3. 2015第25周三iframe小结

    一个 HTML页面可以有一个或多个子框架,这些子框架以<iframe>来标记,用来显示一个独立的HTML页面.这里所讲的框架编程包括框架的自我控制以及框架之间的互相访问,例如从一个框架中引 ...

  4. 判断UserAgent是否为手机

     , )))             {                 return true;             }             return false;         }

  5. DPDK2.1开发者手册4-7

    Mempool Labrary 一个内存池(memory pool)就是固定大小对象的分配器.在dpdk中,它是通过名字来标示唯一性的,且使用环形队列来保存没有使用的空闲对象.它提供了一些可选项服务例 ...

  6. Eclipse默认配色的恢复方法

    Eclipse默认配色的恢复方法 很多搞开发的同学一开始不喜欢默认的eclipse白底配色,去网上千辛万苦搜到了很多黑底暗色的各种eclipse配色然后import上了,之后却发现并不适合自己,想找默 ...

  7. SQL Server 各任务所维护

    SQL Server 正在运行的代码查看 SELECT [Spid] = session_id , ecid , [Database] = DB_NAME(sp.dbid) , [User] = nt ...

  8. android中正确保存view的状态

    英文原文: http://trickyandroid.com/saving-android-view-state-correctly/ 转载此译文须注明出处. 今天我们聊一聊安卓中保存和恢复view状 ...

  9. Excel01-不同的单元格输入同一数据

    第一步:按住Ctrl键,选择不同的单元格 第二步:选择完最后一个单元格后,输入需要的数据“YES”,按Ctrl+Enter键结束. 提示:按Ctrl+; 输入当前日期,再按ctrl+Enter实现全部 ...

  10. 小学生之Java中的异常

    1.异常try{ //可能出现异常的代码}catch(Exception ex){ }finally{ //释放资源}2.异常的高级应用开闭原则:对修改关闭,对新增开放3.什么是异常?解析:异常是代码 ...