[Codeforces] #432 div.2 (Virtual)

= =自觉太颓,模拟赛 #432

Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017)

 

A - Arpa and a research in Mexican wave

这个就真的太...
有点像火车过隧道,随手一个AC

B - Arpa and an exam about geometry

计算几何瞎暴力qwq
结果17次提交被5个点分别卡住
显然如果满足两个条件:不共线,AB == BC 就行了
但是计算有问题
某Cho卡在精度上卡了一小时,,,
= =
显然,如果是Test 40:
0 0 1000000000 1 1000000000 -999999999
这种数据double没法保存所有精度
所以经过翻阅某蓝名的代码:原来不用开方的qwq
也就是说,直接判断 ((ax-bx)*(ax-bx)+(ay-by)*(ay-by)) == ((bx-cx)*(bx-cx)+(by-cy)*(by-cy)) 即可
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstdlib>
 5 using namespace std;
 6 
 7 double equ = 0.000000000001;
 8 
 9 bool getdis(long long ax,long long ay,long long bx,long long by,long long cx,long long cy){
10 //    if(ax < bx) swap(ax,bx);
11 //    if(ay < by) swap(ay,by);
12     return (((ax-bx)*(ax-bx)+(ay-by)*(ay-by)) == ((bx-cx)*(bx-cx)+(by-cy)*(by-cy)));
13 }
14 
15 bool eu(double A,double B){
16     if(A < B) swap(A,B);
17     double cnt = A-B;
18     return cnt < equ;
19 }
20 
21 bool line(long long ax,long long ay,long long bx,long long by,long long cx,long long cy){
22     if((ax == bx && ax == cx) || (ay == by && ay == cy)) return true;
23     if(ax == bx || ay == by || ax == cx || ay == cy || ax == cx || ay == cy) return false;
24     return eu(1.0*(ax-bx)/(ay-by),1.0*(ax-cx)/(ay-cy));
25 }
26 
27 int main(){
28     long long ax,ay,bx,by,cx,cy;
29     scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&ax,&ay,&bx,&by,&cx,&cy);
30     
31     if((ax == bx && ay == by) || (ax == cx && ay == cy) || (bx == cx && by == cy)){
32         cout << "No";
33         return 0;
34     }
35 //    printf("%lf %lf\n",DisAB,DisBC);
36 //    if(eu(DisAB,DisBC)) printf("A ");
37 //    if(!line(ax,ay,bx,by,cx,cy)) printf("C ");
38     if(getdis(ax,ay,bx,by,cx,cy) && !line(ax,ay,bx,by,cx,cy)) printf("Yes");
39     else printf("No"); 
40     
41     return 0;
42 }
= =

 C - Five Dimensional Points

题意:给你一堆五维点,求出点的数量以及点的列表,这些点符合这样的条件-- 每一个点和其他所有点中的两个点所连成的向量之间形成的是钝角,所有维度

题目非常良心,连计算反余弦的公式都给了

给了又如何,不还是WA

= =解析几何没学好被打了

根据题解我们知道:对于每三个点,我们只考虑一个以其中一个点为原点的平面

因此显然:那两个向量在这个平面里一定是在不同的象限

题解感觉也就提供了这个思路

那么还是翻了波代码

看到一个跟官方题解从理论层面神似的代码

是这样的:对于待考虑点,检验点1,检验点2

显然在一个平面内两个向量夹角大于 90°

那么根据平面向量的知识我们知道:

x1 x2+y1 y2 < 0

此时两个向量所成角为钝角

那么其中的 x y 其实也就是两维的标量,将其扩展到五维即可

那么只要每一维的点积都是 < 0 ,其总和也必 < 0

 1 #include<cstdio>
 2 #include<iostream>
 3 #define maxn 2000
 4 using namespace std;
 5 
 6 int inc[maxn][5];
 7 
 8 int n,bad[maxn],num;
 9 
10 int conclude(int a,int b,int c){
11     int ret = 0;
12     for(int i = 0;i < 5;i++) ret += (inc[a][i]-inc[b][i])*(inc[c][i]-inc[b][i]);
13     return ret;
14 }
15 
16 int main(){
17     scanf("%d",&n);
18     num = n;
19     for(int i = 1;i <= n;i++)
20         for(int j = 0;j < 5;j++)
21             scanf("%d",&inc[i][j]);
22 
23     for(int k = 1;k <= n;k++)
24         for(int i = 1;i <= n;i++)
25             for(int j = 1;j <= n;j++)
26                 if(k != i && i != j && k != j && conclude(i,k,j) > 0) bad[k] = 1,num--,i = n,j = n;
27                 
28     cout << num << endl;
29     for(int i = 1;i <= n;i++) if(!bad[i]) cout << i << ' ';
30 
31     return 0;
32 }
= =

 

posted @ 2017-09-29 16:06  μSsia  阅读(178)  评论(0编辑  收藏  举报