Watering Grass
Watering Grass
https://ac.nowcoder.com/acm/problem/115996
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <queue> #include <vector> #include <stack> #include <map> #include <set> #include <sstream> #include <iomanip> #include <cmath> #include <bitset> #include <assert.h> using namespace std; typedef long long ll; typedef set<int>::iterator ssii; #define Cmp(a, b) memcmp(a, b, sizeof(b)) #define Cpy(a, b) memcpy(a, b, sizeof(b)) #define Set(a, v) memset(a, v, sizeof(a)) #define debug(x) cout << #x << ": " << x << endl #define _forS(i, l, r) for(set<int>::iterator i = (l); i != (r); i++) #define _rep(i, l, r) for(int i = (l); i <= (r); i++) #define _for(i, l, r) for(int i = (l); i < (r); i++) #define _forDown(i, l, r) for(int i = (l); i >= r; i--) #define debug_(ch, i) printf(#ch"[%d]: %d\n", i, ch[i]) #define debug_m(mp, p) printf(#mp"[%d]: %d\n", p->first, p->second) #define debugS(str) cout << "dbg: " << str << endl; #define debugArr(arr, x, y) _for(i, 0, x) { _for(j, 0, y) printf("%c", arr[i][j]); printf("\n"); } #define _forPlus(i, l, d, r) for(int i = (l); i + d < (r); i++) #define lowbit(i) (i & (-i)) #define MPR(a, b) make_pair(a, b) pair<int, int> crack(int n) { int st = sqrt(n); int fac = n / st; while (n % st) { st += 1; fac = n / st; } return make_pair(st, fac); } inline ll qpow(ll a, int n) { ll ans = 1; for(; n; n >>= 1) { if(n & 1) ans *= 1ll * a; a *= a; } return ans; } template <class T> inline bool chmax(T& a, T b) { if(a < b) { a = b; return true; } return false; } ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); } ll ksc(ll a, ll b, ll mod) { ll ans = 0; for(; b; b >>= 1) { if (b & 1) ans = (ans + a) % mod; a = (a * 2) % mod; } return ans; } ll ksm(ll a, ll b, ll mod) { ll ans = 1 % mod; a %= mod; for(; b; b >>= 1) { if (b & 1) ans = ksc(ans, a, mod); a = ksc(a, a, mod); } return ans; } template <class T> inline bool chmin(T& a, T b) { if(a > b) { a = b; return true; } return false; } bool _check(int x) { // return true; } int bsearch1(int l, int r) { while (l < r) { int mid = (l + r) >> 1; if(_check(mid)) r = mid; else l = mid + 1; } return l; } int bsearch2(int l, int r) { while (l < r) { int mid = (l + r + 1) >> 1; if(_check(mid)) l = mid; else r = mid - 1; } return l; } template<class T> bool lexSmaller(vector<T> a, vector<T> b) { int n = a.size(), m = b.size(); int i; for(i = 0; i < n && i < m; i++) { if (a[i] < b[i]) return true; else if (b[i] < a[i]) return false; } return (i == n && i < m); } // ============================================================== // const int maxn = 1e4 + 10; class A { public: double l, r; A() = default; A(double l, double r) : l(l), r(r) {} bool operator< (const A &rhs) const { return l < rhs.l || (l == rhs.l && r < rhs.r); } } a[maxn]; int n, m = 0; double L, W; void solve() { sort(a+1, a+1+m); if (a[1].l > 0) { printf("-1\n"); return; } int ans = 0; double to = 0.0; int i = 1; bool ok = true; while (to < L) { ans++; double lst = to; while (i <= m && a[i].l <= lst) { chmax(to, a[i].r); i++; } if (lst == to && to < L) { ok = false; break; } } if (ok) printf("%d\n", ans); else printf("-1\n"); } void init() { m = 0; } int main() { freopen("input.txt", "r", stdin); while (~scanf("%d%lf%lf", &n, &L, &W)) { init(); // get data _rep(i, 1, n) { double x, r; scanf("%lf%lf", &x, &r); if (r < W/2) continue; double dx = sqrt(r*r - W*W/4); a[++m] = A(x-dx, x+dx); } // then solve solve(); } }