Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem H. Parallel Worlds 计算几何...

Problem H. Parallel Worlds

题目连接:

http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c7022&all_runs=1&action=140

Description

Alex is a Baisuralen State University student. Alex and BSU live in two parallel worlds. As we know from
school geometry classes, parallel lines do not intersect. However, in reality and unfortunately these two
parallel worlds do intersect.
There are some courses in BSU that came from hell. They make parallel worlds intersect and force Alex
to visit lectures. Or even more, they cause pain and humiliation. (It was once even said, that the other
name for course of ‘Functional Analysis’ (shortly FUN) is ‘Pain and Humiliation’. That is, FUN is not
fun.) For example, once Alex slept during such course, and was woken up by professor’s voice. Afterwards
he was asked if he had moved to Banach Space and was told to move to railway station.
Not everything is so bad, however. There are courses that are from heaven. They are finished in any mark
you want without needing to visit them.
You are requested to provide a procedure to establish that some courses are from heaven. As part of that,
you need to provide two sets of points P and Q on a plane, each containing N points. All points in P
and Q should be distinct, and the intersection of P and Q should be empty. Sets P and Q should satisfy
the following property. There should exist N pairwise nonparallel lines, such that sets of projections of P
and Q on these lines coincide. Of course, the lines should also be provided. Moreover, pairs of points that
coincide are also required.
One can show that for any positive integer N such sets of points exist.

Input

The only line of input contains a single number N (1 ≤ N ≤ 100).

Output

Output 3 × N lines.
First N lines should contain two real numbers x
P
i
y
P
i — coordinates of points in set P.
Next N lines should contain two real numbers x
Q
i
y
Q
i — coordinates of points in set Q.
Afterwards output the descriptions of the lines: three real numbers Ai
, Bi and Ci—coefficients of the ith
line (Aix + Biy + Ci = 0), and a permutation of numbers from 1 to N (qi1, qi2, . . . , qiN ) (the projection of
the first point from P should coincide with the projection of the qi1st point of the set Q, the projection
of the second point from P should coincide with the projection of the qi2nd point of Q and so on).
Absolute value of all numbers should not be greater than 106
.
The distance between any two points from P ∪ Q should be at least 1. And P ∩ Q = ∅.
Two lines are considered parallel if the angle between the lines is less than 10−2
rad., or if the cross
product AiBj − BiAj is less than 10−6
.
Two projections coincide if the distance between them is not greater than 10−6

Sample Input

1

Sample Output

0 0
1 0
1 0 0 1

Hint

题意

让你构造两个点集合,各有n个点,且不相交。

然后你需要构造n条直线

然后需要这俩集合中的点,对于每一条线,都能在直线上面的映射相同。

题解:

看着烧脑子,但实际上构造一个正2n边形就好了。

代码

 #include<bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
vector<pair<double,double> >P;
vector<pair<double,double> >Q;

/* 基本几何结构 */
struct POINT
{
 double x;
 double y;
 POINT(double a=0, double b=0) { x=a; y=b;} //constructor
};
struct LINESEG
{
 POINT s;
 POINT e;
 LINESEG(POINT a, POINT b) { s=a; e=b;}
 LINESEG() { }
};
struct LINE           // 直线的解析方程 a*x+b*y+c=0  为统一表示,约定 a >= 0
{
   double a;
   double b;
   double c;
   LINE(double d1=1, double d2=-1, double d3=0) {a=d1; b=d2; c=d3;}
};
LINE makeline(POINT p1,POINT p2)
{
 LINE tl;
 int sign = 1;
 tl.a=p2.y-p1.y;
 if(tl.a<0)
 {
  sign = -1;
  tl.a=sign*tl.a;
 }
 tl.b=sign*(p1.x-p2.x);
 tl.c=sign*(p1.y*p2.x-p1.x*p2.y);
 return tl;
}
vector<LINE>AA;
int mp[105];
int main(){
    int n;
    scanf("%d",&n);
    if(n==1){
        printf("0 0\n");
        printf("1 0\n");
        printf("1 0 0 1\n");
        return 0;
    }
    double len = 10000;
    double x = pi/n;
    POINT AAA,BBB;
    for(int i=0;i<2*n;i++){
        double X = len * sin(x*i);
        double Y = len * cos(x*i);
        if(i%2==0){
            P.push_back(make_pair(X,Y));
            AAA = POINT(X,Y);
        }else{
            Q.push_back(make_pair(X,Y));
            BBB = POINT(X,Y);
        }
        if(i>=1&&i<=n){
            POINT A,B;
            A.x = (AAA.x+BBB.x)/2.0;
            A.y = (AAA.y+BBB.y)/2.0;
            B.x = 0;
            B.y = 0;
            AA.push_back(makeline(A,B));
        }
    }
    for(int i=0;i<n;i++)
        printf("%.12f %.12f\n",P[i].first,P[i].second);
    for(int i=0;i<n;i++)
        printf("%.12f %.12f\n",Q[i].first,Q[i].second);
    for(int i=0;i<n;i++){
        printf("%.12f %.12f %.12f ",AA[i].a,AA[i].b,AA[i].c);
        int a1 = i/2,b1 = (i+1)/2;
        for(int j=0;j<n;j++){
            mp[(a1-j+n)%n] = (b1+j)%n;
        }
        for(int j=0;j<n;j++)
            printf("%d ",mp[j]+1);
        printf("\n");
    }
}

转载于:https://www.cnblogs.com/qscqesze/p/5767081.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值