全部:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 10005;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int mod = 1e9 + 7;
bool dy(double x,double y) { return x > y + eps;} // x > y
bool xy(double x,double y) { return x < y - eps;} // x < y
bool dyd(double x,double y) { return x > y - eps;} // x >= y
bool xyd(double x,double y) { return x < y + eps;} // x <= y
bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y
int n;
struct lp{
double x,y,rad;
int id;
lp(){}
lp(double a,double b){x=a,y=b;}
}cw[N];
lp operator +(lp A,lp B){return (lp){A.x+B.x,A.y+B.y};}
lp operator -(lp A,lp B){return (lp){A.x-B.x,A.y-B.y};}
lp operator *(lp A,double B){return (lp){A.x*B,A.y*B};}
lp operator /(lp A,double B){return (lp){A.x/B,A.y/B};}
double operator *(lp A,lp B){return A.x*B.x+A.y*B.y;}
double operator ^(lp A,lp B){return A.x*B.y-A.y*B.x;}
inline double crossDot(lp a,lp b){
return a.x*b.y-a.y*b.x;
}
inline double area2(lp a,lp b,lp c){
return crossDot(b-a,c-a);
}
double leng(lp A,lp B){return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));}
double disToLine(lp P,lp A,lp B){return fabs(crossDot(B-A,P-A))/leng(A,B);}
//3 4 1 2
bool cmp1(lp a,lp b){
double p=atan2(a.y,a.x),q=atan2(b.y,b.x);
if(p!=q){
return p<q;
}
return a.x<b.x;
}
//2 3 4 1 2
bool cmp2(lp a,lp b){
lp c;
c.x=c.y=0;
double tmp=area2(c,a,b);
if(tmp==0)return a.x<b.x;
return tmp>0;
}
//象限排序,注意包含四个坐标轴
int Quadrant(lp a){
if(a.x>0&&a.y>=0) return 1;
if(a.x<=0&&a.y>0) return 2;
if(a.x<0&&a.y<=0) return 3;
if(a.x>=0&&a.y<0) return 4;
return -1;
}
//1 2 3 4
bool cmp3(lp a,lp b){
if(Quadrant(a)==Quadrant(b)){
return cmp1(a,b);
}
return Quadrant(a)<Quadrant(b);
}
//先按象限排序,再按极角排序,再按远近排序
// 1 2 3 4
bool cmp4(const lp &a, const lp &b){
if (a.y == 0 && b.y == 0 && a.x*b.x <= 0)return a.x>b.x;
if (a.y == 0 && a.x >= 0 && b.y != 0)return true;
if (b.y == 0 && b.x >= 0 && a.y != 0)return false;
if (b.y*a.y <= 0)return a.y>b.y;
lp one;
one.y = one.x = 0;
return area2(one,a,b) > 0 || (area2(one,a,b) == 0 && a.x < b.x);
}
//象限排序,注意包含四个坐标轴
int Quadrant1(lp a){
if(a.x>0&&a.y>=0) return 3;
if(a.x<=0&&a.y>0) return 4;
if(a.x<0&&a.y==0) return 4;
if(a.x<0&&a.y<=0) return 1;
if(a.x>=0&&a.y<0) return 2;
}
//3 4 1 2
bool cmp5(lp &a,lp &b){
int qa=Quadrant1(a),qb=Quadrant1(b);
if(qa==qb){
return cmp2(a,b);
}
return qa<qb;
}
int main(){
while(~scanf("%d",&n)){
for(int i=0;i<n;++i){
scanf("%lf%lf",&cw[i].x,&cw[i].y);
cw[i].id=i+1;
}
sort(cw,cw+n,cmp1);
for(int i=0;i<n;++i){
printf("%d (%.0f,%.0f)\n",cw[i].id, cw[i].x,cw[i].y);
}
}
return 0;
}
部分:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 10005;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int mod = 1e9 + 7;
int n;
struct lp{
double x,y,rad;
int id;
lp(){}
lp(double a,double b){x=a,y=b;}
}cw[N];
lp operator +(lp A,lp B){return (lp){A.x+B.x,A.y+B.y};}
lp operator -(lp A,lp B){return (lp){A.x-B.x,A.y-B.y};}
lp operator *(lp A,double B){return (lp){A.x*B,A.y*B};}
lp operator /(lp A,double B){return (lp){A.x/B,A.y/B};}
double operator *(lp A,lp B){return A.x*B.x+A.y*B.y;}
double operator ^(lp A,lp B){return A.x*B.y-A.y*B.x;}
inline double crossDot(lp a,lp b){
return a.x*b.y-a.y*b.x;
}
inline double area2(lp a,lp b,lp c){
return crossDot(b-a,c-a);
}
double leng(lp A,lp B){return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));}
double disToLine(lp P,lp A,lp B){return fabs(crossDot(B-A,P-A))/leng(A,B);}
//3 4 1 2
bool cmp1(lp a,lp b){
double p=atan2(a.y,a.x),q=atan2(b.y,b.x);
if(p!=q){
return p<q;
}
return a.x<b.x;
}
//2 3 4 1 2
bool cmp2(lp a,lp b){
lp c;
c.x=c.y=0;
double tmp=area2(c,a,b);
if(tmp==0)return a.x<b.x;
return tmp>0;
}
//象限排序,注意包含四个坐标轴
int Quadrant1(lp a){
if(a.x>0&&a.y>=0) return 3;
if(a.x<=0&&a.y>0) return 4;
if(a.x<0&&a.y==0) return 4;
if(a.x<0&&a.y<=0) return 1;
if(a.x>=0&&a.y<0) return 2;
}
//3 4 1 2
bool cmp5(lp &a,lp &b){
int qa=Quadrant1(a),qb=Quadrant1(b);
if(qa==qb){
return cmp2(a,b);
}
return qa<qb;
}
int main(){
while(~scanf("%d",&n)){
for(int i=0;i<n;++i){
scanf("%lf%lf",&cw[i].x,&cw[i].y);
cw[i].id=i+1;
}
sort(cw,cw+n,cmp1);
for(int i=0;i<n;++i){
printf("%d (%.0f,%.0f)\n",cw[i].id, cw[i].x,cw[i].y);
}
}
return 0;
}