思路:转换成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. 【HDOJ】2585 Hotel

    字符串水题. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 55 cha ...

  2. FZU2179/Codeforces 55D beautiful number 数位DP

    题目大意: 求  1(m)到n直接有多少个数字x满足 x可以整出这个数字的每一位上的数字 思路: 整除每一位.只需要整除每一位的lcm即可 但是数字太大,dp状态怎么表示呢 发现 1~9的LCM 是2 ...

  3. WC2015流水账

    THU那四场考试没考好,只有20+名.这也许是我OI生涯中最后一场吧(已确认是最后一场),真是感慨万千. day0 搬进浙大宿舍404房间(神房间号),四个人一间.中午发现学军伙食相当良心,是我参加的 ...

  4. python Aspscheduler 定时任务框架使用

    前几日,爬虫基本能爬点东西出来了,现在需要实现定时把数据爬到DB里去,可以使用windows定时任务执行py脚本,但好像不彻底,要做一个纯(jiao)粹(qing)的程序员,定时任务的重任落到了Asp ...

  5. (转)关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi

    首先是几个基本概念:1.屏幕尺寸Screen size即显示屏幕的实际大小,按照屏幕的对角线进行测量.为简单起见,Android把所有的屏幕大小分为四种尺寸:小,普通,大,超大(分别对应:small, ...

  6. 【80端口占用】win7下80端口被(Pid=4)占用的解决方法

    亲测可用 通过cmd命令查询占用进程的pid netstat -ano 如果要是tomcat等一般程序占用了端口,一般pid比较大,直接找到相应的pid结束掉进程就行啦. 但是如果pid是4,代表sy ...

  7. CentOS6.3(64位)下安装Oracle11gR2(64)服务器

    安装环境 Linux服务器:Centos6.3 64位 Oracle服务器:Oracle11gR2 64位 系统要求 1.Linux安装Oracle系统要求 系统要求 说明 内存 必须高于1G的物理内 ...

  8. 使用Eclipse生成自动生成apk

    使用Eclipse生成自动生成apk     在eclipse的Preferences -> Android -> Build中有一项“Skip packaging and dexing ...

  9. laravel敏捷应用

    App Category Recipes dealing with Laravel's App facade Checking Your Environment Checking if You're ...

  10. java 不同意同一账户不同IP 同一时候登录系统解决的方法 兼容IE Firefox

    需求就是 不同意同一个账户同一时间登录系统.仅仅要有一个账户在线其它人就是不能用这个账户. 功能非常easy,过程非常纠结 . 这篇文章攻克了兼容IE.Firefox 浏览器下,不同IP 地址 同一用 ...