[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 }
转载请注明出处 -- 如有意见欢迎评论