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

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

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

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

WA的程序:

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define dou long double
const dou eps=1e-;
int n;
struct Point{
dou x,y,z;
Point(){}
Point(dou x0,dou y0,dou z0):x(x0),y(y0),z(z0){}
};
struct Line{
Point s,e,p;
int id;
Line(){}
Line(Point s0,Point e0):s(s0),e(e0){}
}l[];
int tmp[];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
bool cmp(Line l1,Line l2){
Point p1=l1.p,p2=l2.p;
if (fabs(p1.x-p2.x)<eps&&fabs(p1.y-p2.y)<eps) return p1.z<p2.z;
else
if (fabs(p1.x-p2.x)<eps) return p1.y<p2.y;
return p1.x<p2.x;
}
bool operator ==(Point p1,Point p2){
return fabs(p1.x-p2.x)<=eps&&fabs(p1.y-p2.y)<=eps&&fabs(p1.z-p2.z)<=eps;
}
bool operator !=(Point p1,Point p2){
if (p1==p2) return ;
else return ;
}
double operator /(Point p1,Point p2){
return p1.x*p2.x+p1.y*p2.y+p1.z*p2.z;
}
Point operator -(Point p1,Point p2){
return Point(p1.x-p2.x,p1.y-p2.y,p1.z-p2.z);
}
Point operator *(Point p1,Point p2){
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);
}
Point operator /(Point p1,dou x){
return Point(p1.x/x,p1.y/x,p1.z/x);
}
dou sqr(dou x){
return x*x;
}
dou dist(Point p){
return sqrt(sqr(p.x)+sqr(p.y)+sqr(p.z));
}
dou dist(Point p1,Point p2){
return dist(p1-p2);
}
bool zero(dou x){
if (fabs(x)<eps) return ;
return ;
}
bool zero(Point p){
return zero(p.x)&&zero(p.y)&&zero(p.z);
}
bool LineIntersect(Line p1, Line p2){
dou x1=p1.s.x,x2=p1.e.x,x3=p2.s.x,x4=p2.e.x;
dou y1=p1.s.y,y2=p1.e.y,y3=p2.s.y,y4=p2.e.y;
dou z1=p1.s.z,z2=p1.e.z,z3=p2.s.z,z4=p2.e.z;
dou x12=(x1-x2),x13=(x1-x3),x34=(x3-x4);
dou y12=(y1-y2),y13=(y1-y3),y34=(y3-y4);
dou z12=(z1-z2);
dou t=(y34*x12-x34*y12);
if (fabs(t)<eps) return ;
return ;
}
Point inter(Line p1,Line p2){
dou x1=p1.s.x,x2=p1.e.x,x3=p2.s.x,x4=p2.e.x;
dou y1=p1.s.y,y2=p1.e.y,y3=p2.s.y,y4=p2.e.y;
dou z1=p1.s.z,z2=p1.e.z,z3=p2.s.z,z4=p2.e.z;
dou x12=(x1-x2),x13=(x1-x3),x34=(x3-x4);
dou y12=(y1-y2),y13=(y1-y3),y34=(y3-y4);
dou z12=(z1-z2);
dou t=(y13*x34-y34*x13)/(y34*x12-x34*y12);
dou x=x1+x12*((y13*x34-y34*x13)/(y34*x12-x34*y12));
dou y=y1+y12*t,z=z1+z12*t;
return Point(x,y,z);
}
void solve(){
int ans=;
for (int i=;i<=n;i++){
Point p=l[i].e-l[i].s;
dou len=dist(p);
p=p/len;
l[i].p=p;
}
std::sort(l+,l++n,cmp);
int id=;
l[].id=;
for (int i=;i<=n;i++)
if (l[i].p!=l[i-].p)
l[i].id=++id;
else
l[i].id=id;
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++)
if (LineIntersect(l[i],l[j])){
Point p=inter(l[i],l[j]);
Point e1=l[i].e-l[i].s,e2=l[j].e-l[j].s;
dou len1=dist(e1),len2=dist(e2);
e1=e1/len1;e2=e2/len2;
dou x1=e1.x,x2=e2.x,y1=e1.y,y2=e2.y,z1=e1.z,z2=e2.z;
dou x=;
dou y=(x2*z1-x1*z2)/(y1*z2-z1*y2);
dou z=(-x1*x-y1*y)/z1;
Point e=Point(x,y,z);
for (int k=;k<=n;k++) tmp[k]=;
tmp[l[i].id]=;tmp[l[j].id]=;
for (int k=;k<=n;k++)
if (k!=i&&k!=j)
if (fabs((l[k].e-l[k].s)/e)<eps&&LineIntersect(l[i],l[k])) tmp[l[k].id]=;
int cnt=;
for (int k=;k<=n;k++) if (tmp[k]) cnt++;
ans=std::max(ans,cnt);
cnt=;
for (int k=;k<=n;k++)
if (k!=i&&k!=j)
if ((inter(l[k],l[i])==p)) cnt++;
ans=std::max(ans,cnt);
}
printf("%d\n",ans);
}
int main(){
freopen("spider.txt","r",stdin);
n=read();
for (int i=;i<=n;i++){
int kx=read(),bx=read(),ky=read(),by=read();
Point p1,p2;
p1.x=-;p1.y=-kx+bx;p1.z=-ky+by;
p2.x=;p2.y=kx+bx;p2.z=ky+by;
l[i]=Line(p1,p2);
}
solve();
}

只好改成std的写法了。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define sz 1020000
#define ll long long int
using namespace std;
int n,ans=;
ll kx[sz],ky[sz],bx[sz],by[sz];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
ll gcd(ll a,ll b){
if (b==) return a;
else return gcd(b,a%b);
}
bool ok(ll i,ll j,ll &X,ll &Y,ll &T,ll &T2){
if (kx[i] == kx[j]){
if (ky[i] == ky[j]) return ;
T = by[i] - by[j]; T2 = ky[j] - ky[i];
} else{
T = bx[i] - bx[j]; T2 = kx[j] - kx[i];
}
if (kx[i] * T + bx[i] * T2 == kx[j] * T + bx[j] * T2 &&
ky[i] * T + by[i] * T2 == ky[j] * T + by[j] * T2){
X = kx[i] * T + bx[i] * T2;
Y = ky[i] * T + by[i] * T2;
ll g = gcd(gcd(X, Y), gcd(T, T2));
X /= g; Y /= g; T /= g; T2 /= g; return ;
} else return ;
}
void plane(ll i,ll j,ll &A,ll &B,ll &C,ll &D){
if (bx[i]-bx[j]==&&by[i]-by[j]==){
A=ky[i]-ky[j],B=kx[i]-kx[j];
}else{
A=by[i]-by[j],B=bx[i]-bx[j];
}
C=A*kx[i]+B*ky[i];
D=A*bx[i]+B*by[i];
ll g=gcd(gcd(A,B),gcd(C,D));
A/=g;B/=g;C/=g;D/=g;
}
class Hash{
public:
ll F(ll a, ll b, ll c, ll d){
ll s = (a * + b * + c * + d * ) % ;
if (s < ) s = -s;
return s;
}
ll node[], next[sz], A[sz], B[sz], C[sz], D[sz], pass[sz];
ll e;
void ins(ll a,ll b,ll c,ll d){
ll s=F(a,b,c,d);
e++;
next[e]=node[s];node[s]=e;
A[e]=a;B[e]=b;C[e]=c;D[e]=d;
}
bool find(ll a,ll b,ll c,ll d){
ll s=F(a,b,c,d),j;
for (j=node[s];j;j=next[j]){
if (A[j]==a&&B[j]==b&&C[j]==c&&D[j]==d)
return ;
}
return ;
}
}Point,Plane,Slope;
int main(){
freopen("spider.txt","r",stdin);
ll A,B,C,D;
n=read();
for (int i=;i<=n;i++)
kx[i]=read(),bx[i]=read(),ky[i]=read(),by[i]=read();
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++)
if (ok((ll)i,(ll)j,A,B,C,D)){
if (!Point.find(A,B,C,D)) Point.ins(A,B,C,D);
plane(i,j,A,B,C,D);
if (!Plane.find(A,B,C,D)) Plane.ins(A,B,C,D);
}
for (ll i=;i<=Point.e;i++){
for (ll a=;a<=n;a++){
if (kx[a]*Point.C[i]+bx[a]*Point.D[i]==Point.A[i])
if (ky[a]*Point.C[i]+by[a]*Point.D[i]==Point.B[i])
Point.pass[i]++;
}
}
for (ll i=;i<=Plane.e;i++){
for (ll a=;a<=n;a++){
if (kx[a] * Plane.A[i] + ky[a] * Plane.B[i] == Plane.C[i])
if (bx[a] * Plane.A[i] + by[a] * Plane.B[i] == Plane.D[i])
if (!Slope.find(kx[a],ky[a],i,)){
Plane.pass[i]++;
Slope.ins(kx[a],ky[a],i,);
}
}
}
for (int i=;i<=Point.e;i++)
if (Point.pass[i]>ans) ans=Point.pass[i];
for (int i=;i<=Plane.e;i++)
if (Plane.pass[i]>ans) ans=Plane.pass[i];
printf("%d\n",ans);
}

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. Android中ListView通过BaseAdapter实现数据的绑定

    1. public class ListFiles extends Activity { ListView Listview=null; protected void onCreate(Bundle ...

  2. 使用Horner法则计算多项式的值

    计算Pn(x) = an * x^n + an-1 * x^(n-1) + ... + a1 * x + a0 直接计算,需要做的乘法次数 1+2+3+……+n = n(1+n)/2 = O(n2) ...

  3. Geeks Interview Question: Ugly Numbers

    Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence1, 2, 3, 4, 5, 6, 8, 9, ...

  4. NOI2014 D2T3 购票 简单粗暴解法(凸包维护)

    之前说过这题能用点分治(详见 http://www.cnblogs.com/jasonyu/p/noi2014.html),但其实还有更粗暴的解法. 要求出一个点的答案,我们需要知道树上一段路径的点形 ...

  5. iOS打电话、发邮件、发短信、打开浏览器

    //1.调用 自带mail [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://163@16 ...

  6. 【C#基础】byte二进制数组转string

    //解析post请求数组返回的数组 //解码返回的二进制数组 public string DecodeBytes(byte[] c) { string html = string.Empty; try ...

  7. HBase总结(十二)Java API 与HBase交互实例

    HBase提供了Java Api的訪问接口,掌握这个就跟Java应用使用RDBMS时须要JDBC一样重要 import java.io.IOException; import org.apache.h ...

  8. android中定位光标位置

    edittext.setSelection(int); edittext.setText(123);//设置edittext中的内容 edittext.setSelection(123.length( ...

  9. android 多项对话框

    在main.xml中 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...

  10. 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果

    首先呢,还是一贯作风,我们先来看看众多应用中的示例:(这种效果是很常见的,可以说应用的必须品.)                搜狐客户端                               ...