ACM 2015年上海区域赛A题 HDU 5572An Easy Physics Problem

题意:
光滑平面,一个刚性小球,一个固定的刚性圆柱体 ,给定圆柱体圆心坐标,半径 ,小球起点坐标,起始运动方向(向量) ,终点坐标 ,问能否到达终点,小球运动中如果碰到圆柱体会反射。

学到了向量模板,写法简洁。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<iostream>
  5 #define clc(a,b) sizeof(a,b,sizeof(a))
  6 #define LL long long
  7 #include<cmath>
  8 using namespace std;
  9 struct node {
 10     double dis(node);//两点距离
 11
 12     //向量操作
 13     node add(node);//加
 14     double mul(node);//乘
 15     node mul(double);//倍
 16     double abs();//模长
 17     node unt();//单位化
 18     node neg();//取反
 19     double agl(node);//夹角,度数
 20     bool eql(node);//向量相等
 21     int pal(node);//向量平行
 22
 23     double x,y;
 24 };
 25 double node::dis(node a) {
 26     return sqrt(pow(x-a.x,2)+pow(y-a.y,2));
 27 }
 28
 29 node node::add(node a) {
 30     return {x+a.x,y+a.y};
 31 }
 32 double node::mul(node a) {
 33     return x*a.x+y*a.y;
 34 }
 35 node node::mul(double a) {
 36     return {x*a,y*a};
 37 }
 38 node node::neg() {
 39     return {-x,-y};
 40 }
 41
 42 double node::abs() {
 43     return sqrt(x*x+y*y);
 44 }
 45 node node::unt() {
 46     double d=this->abs();
 47     return {x/d,y/d};
 48 }
 49 double node::agl(node a) {
 50     return acos((x*a.x+y*a.y)/(this->abs()*a.abs()));
 51 }
 52
 53 bool node::eql(node a) {
 54     if(fabs(x-a.x)<1e-6&&fabs(y-a.y)<1e-6)return 1;
 55     return 0;
 56 }
 57 int node::pal(node a) {
 58     node u1=this->unt();//判断单位向量
 59     node u2=a.unt();
 60     if(u1.eql(u2))return 1;//方向相同
 61     if(u1.eql(u2.neg()))return -1;//方向相反
 62     return 0;
 63 }
 64
 65 double r;
 66 node A,B,C,O;
 67 node AB,AC,AO;
 68
 69 int stop() {
 70     double a=B.dis(O);
 71     double b=A.dis(O);
 72     if(a<r||b<r)return 1;
 73     double c=A.dis(B);
 74     double p=(a+b+c)/2;
 75     double s=sqrt(p*(p-a)*(p-b)*(p-c));
 76     if(c>a&&c>b) {
 77         if(2*s/c<r)return 1;
 78         return 0;
 79     }
 80     return 0;
 81 }
 82
 83 int only() {
 84     if(AC.pal(AB)==1)return 1;
 85     return 0;
 86 }
 87
 88 double root(double a,double b,double c) {
 89     return (-b-sqrt(b*b-4*a*c))/(2*a);
 90 }
 91
 92 void getc() {
 93     double ao=A.dis(O);
 94     double ac=root(1,-2*ao*cos(AC.agl(AO)),ao*ao-r*r);
 95     C=A.add(AC.unt().mul(ac));
 96 }
 97
 98 int fun(node a,node b,node c) {
 99     if(a.add(b).pal(c)==1)return 1;
100     return 0;
101 }
102
103 int jude() {
104     AB= {B.x-A.x,B.y-A.y};
105     AO= {O.x-A.x,O.y-A.y};
106     if(stop())return 0;
107     if(only())return 1;
108
109     getc();
110     node CB= {B.x-C.x,B.y-C.y};
111     node OC= {C.x-O.x,C.y-O.y};
112     if(fun(AC.neg().unt(),CB.unt(),OC.unt()))return 1;
113     return 0;
114 }
115 int main() {
116     int T;
117     scanf("%d",&T);
118     for(int kase=1; kase<=T; kase++) {
119         scanf("%lf%lf%lf",&O.x,&O.y,&r);
120         scanf("%lf%lf%lf%lf",&A.x,&A.y,&AC.x,&AC.y);
121         scanf("%lf%lf",&B.x,&B.y);
122         printf("Case #%d: ",kase);
123         if(jude())printf("Yes\n");
124         else printf("No\n");
125     }
126     return 0;
127 }

时间: 2024-08-08 09:35:28

ACM 2015年上海区域赛A题 HDU 5572An Easy Physics Problem的相关文章

HDU 5245 Joyful (2015年上海大都赛J题,概率)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5245 题意: 给定一个n*m的矩形,由n*m个格子组成,我们可以选k次,每次可以选择的两个格子 这两个格子作为矩形的对角线可以确定一个矩形,这个矩形里的所有小格子都会被覆 盖,求k次后,被覆盖的格子的个数的期望. 分析: 棋盘被覆盖的格子数的期望 = 每个格子被覆盖的概率的和. 每次选择的方案有n*m*n*m种. 格子坐标为(i,j)被覆盖的方案数为: tot = 2*(2*(i*j*(n-i+1)

UVALive 7148 LRIP 14年上海区域赛K题 树分治

题意 n个点组成一棵树, 带有点权. 求最长不降的路径的长度, 且路径上最大值最小值之差不超过D. 显然是树分治, 但是分治之后如何维护答案呢. 假设当前重心为g, 分别记录g出发不降路径的长度,以及最大值, 和不升路径的长度以及最小值. 这里用到一个map和二分, 线段树也可以, 但是如果用线段树还要考虑负值, 再加上线段树的clear以及稍微暴力的查询.  常数大小不好说. 1 #include <bits/stdc++.h> 2 using namespace std; 3 typede

2014上海区域赛 I题 Defeat the Enemy 离线读入 在线更新 线段树套优先队列

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5158 UVALive 7146 题意 自己有n个军队 敌方有m个军队 每个军队都有攻击力和防守力两种属性 当一方的攻击力>=对方的防御力时 可以把对方杀掉 在一次战斗中有可能出现双方都死了或者双方都没死的情况 另外要求己方不能有两只不同军队跟对方的同一只军队交

[暑假集训]区域赛套题集

2014-07-03 [浙江第11届省赛]ZOJ 3785 What day is that day?  (打表找循环节) [暑假集训]区域赛套题集

Heshen&#39;s Account Book HihoCoder - 1871 2018北京区域赛B题(字符串处理)

Heshen was an official of the Qing dynasty. He made a fortune which could be comparable to a whole country's wealth by corruption. So he was known as the most corrupt official in Chinese history. But Emperor Qianlong liked, or even loved him so much

2017年ICPC中国大陆区域赛真题(下)

2017年ICPC中国大陆区域赛真题(下) A - Lovers #include <bits/stdc++.h> using namespace std; const int maxn=2e5+10; int n,k,a[maxn],b[maxn],ans; int main() { int _; scanf("%d", &_); while (_--) { scanf("%d%d", &n, &k); for (int i =

hdu5080:几何+polya计数(鞍山区域赛K题)

/* 鞍山区域赛的K题..当时比赛都没来得及看(反正看了也不会) 学了polya定理之后就赶紧跑来补这个题.. 由于几何比较烂写了又丑又长的代码,还debug了很久.. 比较感动的是竟然1Y了.. */ 题目大意: 给定一些点,某些点上有边,问用k种颜色染色的等价类有多少种 思路: 由于坐标是整数..只有可能旋转90,180,270才能得到置换 且图形必须为中心对称图形 先用几何方法找出对称中心 然后旋转,找是否出现置换... 由于点数只有50,几何预处理这一部分可以很暴力无脑的写..各种判断相

HDU 4438 Hunters 区域赛水题

本文转载于 http://blog.csdn.net/major_zhang/article/details/52197538 2012天津区域赛最水之题: 题意容易读懂,然后就是分情况求出A得分的数学期望,所谓数学期望就是在该概率下的平均得分. 现在就是两种方案,Alice要根据输入给出的数据情况选出最优方案,也就是先选老虎,还是狼. 1.A先选老虎: a.B也先选老虎,则得分为Q(P*X+P*Y); //打完老虎还要打狼 b.B选狼,则两人可以直接获得猎物,则得分为(1-Q)*X 所以1方案

ACM学习历程—HDU5476 Explore Track of Point(平面几何)(2015上海网赛09题)

Problem Description In Geometry, the problem of track is very interesting. Because in some cases, the track of point may be beautiful curve. For example, in polar Coordinate system,ρ=cos3θ is like rose, ρ=1−sinθ is a Cardioid, and so on. Today, there