zoukankan      html  css  js  c++  java
  • ACM International Collegiate Programming Contest, Amman Collegiate Programming Contest (2018) GYM 100810 K. League of Demacia

    K. League of Demacia
    time limit per test
    4.0 s
    memory limit per test
    256 MB
    input
    standard input
    output
    standard output

    The war is about to start between Demacia and Noxus. Noxus's army has n soldiers. Noxus's soldiers are stronger than Demacia's soldiers, so Demacia's soldiers can win only if their number is larger than the number of Noxus's soldiers.

    Lux is a magical girl from Demacia, she decided to help her city's army! Lux can shoot an infinite laser in a straight line with a width equal to z and can kill all the enemies in the path! Lux can send the laser only one time, so she needs to kill at least m soldiers to help Demacia's soldiers win the fight.

    Lux stands at the point (0, 0) and she knows the positions of every soldier from Noxus, she wants to know if she can help Demacia's army to win the war. Can you help her?

    Input

    The first line contains an integer T (1 ≤ T ≤ 100) specifying the number of test cases.

    The first line of each test case contains two integers n and m, and a floating point number z (1 ≤ n, m ≤ 1000, 0 < z ≤ 30000), in which nis the number of soldiers in Noxus's army, m is the minimum number of soldiers Lux must kill, and z is the width of Lux's laser.

    Then n lines follow describe each Noxus's Soldier, in which the ith line contains 2 integers xiyi ( - 104 ≤ xi, yi ≤ 104), representing the coordinates of the ith soldier.

    It is guaranteed that no two soldiers share the same pair of coordinates, neither with Lux's position.

    Output

    For each test case, print a single line containing "Yes" (without quotes) if Demacia's army can win. Otherwise, print "No" (without quotes).

    Example
    input
    Copy
    1
    5 3 2
    1 1
    1 2
    2 -2
    3 3
    5 2
    output
    Copy
    Yes
    思路:对每个点考虑什么角度范围能覆盖到他,然后就变成了求一个点被最多的区间覆盖问题,离散化后差分求最大前缀和即可。复杂度nlogn.
      1 #include <iostream>
      2 #include <fstream>
      3 #include <sstream>
      4 #include <cstdlib>
      5 #include <cstdio>
      6 #include <cmath>
      7 #include <string>
      8 #include <cstring>
      9 #include <algorithm>
     10 #include <queue>
     11 #include <stack>
     12 #include <vector>
     13 #include <set>
     14 #include <map>
     15 #include <list>
     16 #include <iomanip>
     17 #include <cctype>
     18 #include <cassert>
     19 #include <bitset>
     20 #include <ctime>
     21 
     22 using namespace std;
     23 
     24 #define pau system("pause")
     25 #define ll long long
     26 #define pii pair<int, int>
     27 #define pb push_back
     28 #define mp make_pair
     29 #define clr(a, x) memset(a, x, sizeof(a))
     30 
     31 const double pi = acos(-1.0);
     32 const int INF = 0x3f3f3f3f;
     33 const int MOD = 1e9 + 7;
     34 const double EPS = 1e-11;
     35 
     36 /*
     37 #include <ext/pb_ds/assoc_container.hpp>
     38 #include <ext/pb_ds/tree_policy.hpp>
     39 
     40 using namespace __gnu_pbds;
     41 tree<pli, null_type, greater<pli>, rb_tree_tag, tree_order_statistics_node_update> T;
     42 */
     43 
     44 int T, n, m;
     45 double z;
     46 struct Double {
     47     double val;
     48     Double () {}
     49     Double (double val) : val(val) {}
     50     bool operator < (const Double &D) const {
     51         return val < D.val - EPS;
     52     }
     53 };
     54 struct seg {
     55     Double x, y;
     56     seg () {}
     57     seg (Double x, Double y) : x(x), y(y) {}
     58 } s[2015];
     59 map<Double, int> mmp;
     60 int cnt[2015];
     61 int main() {
     62     scanf("%d", &T);
     63     while (T--) {
     64         mmp.clear();
     65         clr(cnt, 0);
     66         int cnt_s = 0;
     67         mmp[Double(-pi)], mmp[Double(pi)];
     68         scanf("%d%d%lf", &n, &m, &z);
     69         for (int i = 1; i <= n; ++i) {
     70             int x, y;
     71             scanf("%d%d", &x, &y);
     72             if (z * z < 4 * (x * x + y * y)) {
     73                 double th1 = atan2(y, x);
     74                 double th2 = asin(z / 2.0 / sqrt(x * x + y * y));
     75                 double t1 = th1 - th2, t2 = th1 + th2;
     76                 if (t1 < -pi) {
     77                     s[++cnt_s] = seg(Double(t1 + 2 * pi), Double(pi));
     78                     s[++cnt_s] = seg(Double(-pi), Double(t2));
     79                     t1 += 2 * pi;
     80                 } else if (t2 > pi) {
     81                     s[++cnt_s] = seg(Double(t1), Double(pi));
     82                     s[++cnt_s] = seg(Double(-pi), Double(t2 - 2 * pi));
     83                     t2 -= 2 * pi;
     84                 } else {
     85                     s[++cnt_s] = seg(Double(t1), Double(t2));
     86                 }
     87                 mmp[Double(t1)], mmp[Double(t2)];
     88             } else {
     89                 double th = atan2(y, x);
     90                 double t1 = th - pi / 2, t2 = th + pi / 2;
     91                 if (t1 < -pi) {
     92                     s[++cnt_s] = seg(Double(t1 + 2 * pi), Double(pi));
     93                     s[++cnt_s] = seg(Double(-pi), Double(t2));
     94                     t1 += 2 * pi;
     95                 } else if (t2 > pi) {
     96                     s[++cnt_s] = seg(Double(t1), Double(pi));
     97                     s[++cnt_s] = seg(Double(-pi), Double(t2 - 2 * pi));
     98                     t2 -= 2 * pi;
     99                 } else {
    100                     s[++cnt_s] = seg(Double(t1), Double(t2));
    101                 }
    102                 mmp[Double(t1)], mmp[Double(t2)];
    103             }
    104         }
    105         int cnt_index = 0;
    106         for (map<Double, int>::iterator it = mmp.begin(); it != mmp.end(); ++it) {
    107             it -> second = ++cnt_index;
    108             //printf("%.12f
    ", it -> first.val);
    109         }
    110         for (int i = 1; i <= cnt_s; ++i) {
    111             ++cnt[mmp[s[i].x]], --cnt[mmp[s[i].y] + 1];
    112         }
    113         int ans = 0;
    114         for (int i = 1; i <= cnt_index + 1; ++i) {
    115             cnt[i] += cnt[i - 1];
    116             ans = max(ans, cnt[i]);
    117         }
    118         //printf("%d
    ", ans);
    119         puts(ans >= m ? "Yes" : "No");
    120     }
    121     return 0;
    122 }
    View Code
  • 相关阅读:
    Ubuntu下hadoop2.4搭建集群(单机模式)
    软考历程(2)——海明码校验
    key 串口
    android删除文件出错
    ORACLE 11G没有备份文件參数文件在异机通过rman备份恢复找回被误删的数据
    【SICP归纳】2 高阶函数和数据抽象
    Java加密算法 AES
    从BAE到SAE,从SAE又回到BAE
    velocity-字母序号 list
    Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA
  • 原文地址:https://www.cnblogs.com/BIGTOM/p/9276184.html
Copyright © 2011-2022 走看看