AOJ 2308 - 计算几何


http://blog.csdn.net/acm_xmzhou/article/details/12972113

White Bird

Angry Birds is a mobile game of a big craze all over the world. You were convinced that it was a waste of time to play the game, so you decided to create an automatic solver.
You are describing a routine that optimizes the white bird's strategy to defeat a pig (enemy) by hitting an egg bomb. The white bird follows a parabolic trajectory from the initial position, and it can vertically drop egg bombs on the way.
In order to make it easy to solve, the following conditions hold for the stages.
  • N obstacles are put on the stage.
  • Each obstacle is a rectangle whose sides are parallel to the coordinate axes.
  • The pig is put on the point (X,Y).
  • You can launch the white bird in any direction at an initial velocity V from the origin.
  • If the white bird collides with an obstacle, it becomes unable to drop egg bombs.
  • If the egg bomb collides with an obstacle, the egg bomb is vanished.
The acceleration of gravity is 9.8ms2. Gravity exerts a force on the objects in the decreasing direction of y-coordinate.

Input

A dataset follows the format shown below:
N V X Y
L1 B1 R1 T1

LN BN RN TN
All inputs are integer.
  • N: the number of obstacles
  • V: the initial speed of the white bird
  • XY: the position of the pig
(0N500V500X,Y300X0)
for 1iN,
  • Li: the x-coordinate of the left side of the i-th obstacle
  • Bi: the y-coordinate of the bottom side of the i-th obstacle
  • Ri: the x-coordinate of the right side of the i-th obstacle
  • Ti: the y-coordinate of the top side of the i-th obstacle
(0Li,Bi,Ri,Ti300)
It is guaranteed that the answer remains unaffected by a change of LiBiRi and Ti in 10−6.

Output

Yes/No
You should answer whether the white bird can drop an egg bomb toward the pig.

Sample Input 1

0 7 3 1

Output for the Sample Input 1

Yes

Sample Input 2

1 7 3 1
1 1 2 2

Output for the Sample Input 2

No

Sample Input 3

1 7 2 2
0 1 1 2

Output for the Sample Input 3

No
挺有意思的一道题,情景是愤怒的小鸟。。。题意是一只小鸟从原点开始抛物线飞行,途中会有一堆障碍和一只猪,问你能否在飞行途中下一个蛋,砸到猪。蛋是垂直下落的。
思路:我们只要去考虑鸟能否飞到猪的正上方即可。把障碍分成线段,判断抛物线与线段是否相交,联立解方程组即可。我们逐渐降低这个角度直到恰好经过(X , Y)或恰好经过某个障碍物的左上角或右下角。
  1. const int MAXN = 50 + 10;  
  2. const int MAXS = 10000 + 50;  
  3. const int sigma_size = 26;  
  4. const long long LLMAX = 0x7fffffffffffffffLL;  
  5. const long long LLMIN = 0x8000000000000000LL;  
  6. const int INF = 0x7fffffff;  
  7. const int IMIN = 0x80000000;  
  8. const int inf = 1 << 30;  
  9. #define eps 1e-8  
  10. const long long MOD = 1000000000 + 7;  
  11. const int mod = 100000;  
  12. typedef long long LL;  
  13. const double PI = acos(-1.0);  
  14. typedef double D;  
  15. typedef pair<int , int> pii;  
  16. #define Bug(s) cout << "s = " << s << endl;  
  17. ///#pragma comment(linker, "/STACK:102400000,102400000")  
  18. const double g = 9.8;  
  19. int N , V , X , Y;  
  20. int L[MAXN] , B[MAXN] , R[MAXN] , T[MAXN];  
  21. ///计算以vy的速度竖直向上射出t秒后的位置  
  22. double calc(double vy , double t)  
  23. {  
  24.     return vy * t - g * t * t / 2;  
  25. }  
  26. ///判断a相对lb和ub的位置  
  27. int cmp(double lb , double ub , double a)  
  28. {  
  29.     return a < lb + eps ? -1 : a > ub - eps ? 1 : 0;  
  30. }  
  31. ///判断当路径通过(qx , qy)时,蛋能否砸到猪。  
  32. bool check(double qx , double qy)  
  33. {  
  34.     ///初速度在xy方向上的分速度分别为vx , vy , 通过(qx , qy)的时间为t  
  35.     ///求解联立方程式 vx^2 + vy^2 = V ^ 2 , vx * t = qx , vy * t - 1/2 * g * t^ 2 = qy;  
  36.     double a = g * g / 4 , b = g * qy - V *  V , c = qx * qx + qy * qy;  
  37.     double D = b * b - 4 * a * c;  
  38.     if(D < 0 && D > -eps)D = 0;  
  39.     if(D < 0)return false;  
  40.     for(int d = -1 ; d <= 1 ;d += 2)///联立方程组的两个解  
  41.     {  
  42.         double t2 = (- b + d * sqrt(D)) / (2 * a);  
  43.         if(t2 <= 0)continue;  
  44.         double t = sqrt(t2);  
  45.         double vx = qx / t , vy = (qy + g * t * t / 2) / t;  
  46.         ///判断是否通过猪的正上方  
  47.         double yt = calc(vy , X / vx);  
  48.         if(yt < Y - eps)continue;  
  49.         bool ok = true;  
  50.         for(int i = 0 ; i < N ; i++)  
  51.         {  
  52.             if(L[i] >= X)continue;  
  53.             ///判断猪和正上方的鸟之间是否有障碍物  
  54.             if(R[i] == X && Y <= T[i] && B[i] <= yt)ok = false;  
  55.             ///判断飞到猪的正上方之前是否会碰到障碍物  
  56.             int yL = cmp(B[i] , T[i] , calc(vy , L[i] / vx));///左侧相对位置  
  57.             int yR = cmp(B[i] , T[i] , calc(vy , R[i] / vx));///右侧相对位置  
  58.             int xH = cmp(L[i] , R[i] , vx * (vy / g));///顶点相对位置  
  59.             int yH = cmp(B[i] , T[i] , calc(vy , vy / g));  
  60.             if(xH == 0 && yH >= 0 && yL < 0)ok = false;  
  61.             if(yL * yR <= 0)ok = false;  
  62.         }  
  63.         if(ok)return true;  
  64.     }  
  65.     return false;  
  66. }  
  67. void solve()  
  68. {  
  69.     ///干掉猪以后的障碍物  
  70.     for(int i = 0 ; i < N ; i++)  
  71.     {  
  72.         R[i] = min(R[i] , X);  
  73.     }  
  74.     bool ok = check(X, Y);///直接撞猪上了  
  75.     for(int i = 0 ; i < N ; i++)  
  76.     {  
  77.         ok |= check(L[i] , T[i]);///经过左上角  
  78.         ok |= check(R[i] , T[i]);///经过右下角  
  79.     }  
  80.     puts(ok ? "Yes" : "No");  
  81. }  
  82. int main()  
  83. {  
  84.     while(~scanf("%d%d%d%d" , &N , &V , &X , &Y))  
  85.     {  
  86.         for(int i = 0 ;i < N ; i++)scanf("%d%d%d%d" , &L[i] , &B[i] , &R[i] , &T[i]);  
  87.         solve();  
  88.     }  
  89.     return 0;  
  90. }  

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts