#include <bits/stdc++.h>
#define pb push_back
#define ppb pop_back
#define fr first
#define sc second
#define all(v) v.begin(), v.end()
#define mod (long long)(1e9 + 7)
#define eps (long long)(1e-9)
#define vektor vector
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
const ull Mod = 1e9 + 7;
const ll LIMIT = 2e5;
struct line{
ld a, b;
};
struct point{
ld x, y;
};
ld slope(line a, line b){
ld top = b.b - a.b, bottom = a.a - b.a;
return top / bottom;
}
line inter(line A, line B){
ld x = A.a, y = A.b, u = B.a, v = B.b;
ld a = (y - v) / (x - u);
ld b = y - a * x;
line l;
l.a = a, l.b = b;
return l;
}
line make_line(int x, int y){
line a;
a.a = x, a.b = y;
return a;
}
void find_left(int n, int k, vector <line>& a, vector <ld>& lim){
vector <line> points;
vector <ld> slopes;
points.pb(a[1]);
for(int i = 2; i <= n; i ++){
while(!slopes.empty() && slopes.back() > slope(a[i], points.back())){
slopes.ppb();
points.ppb();
}
if(i & 1 && i < n){
lim[i] = slope(inter(points.back(), a[i]), make_line(0, k));
}
slopes.pb(slope(points.back(), a[i]));
points.pb(a[i]);
}
}
void find_right(int n, int k, vector <line>& a, vector <ld>& lim){
vector <line> points;
vector <ld> slopes;
points.pb(a[n]);
for(int i = n - 1; i > 1; i --){
while(!slopes.empty() && slopes.back() < slope(a[i], points.back())){
slopes.ppb();
points.ppb();
}
if(i & 1 && i < n){
lim[i] = slope(inter(points.back(), a[i]), make_line(0, k));
}
slopes.pb(slope(points.back(), a[i]));
points.pb(a[i]);
}
}
void solve(){
int n, k;
cin >> n >> k;
vector <line> a(n + 1);
for(int i = 1; i <= n; i ++){
cin >> a[i].a >> a[i].b;
}
vector <ld> left(n + 1), right(n + 1);
find_left(n, k, a, left);
find_right(n, k, a, right);
vector <ld> cpr;
for(int i = 3; i < n; i += 2){
cpr.pb(left[i]);
cpr.pb(right[i]);
}
sort(all(cpr));
cpr.resize(unique(all(cpr)) - cpr.begin());
for(int i = 3; i < n; i += 2){
left[i] = lower_bound(all(cpr), left[i]) - cpr.begin() + 1;
right[i] = lower_bound(all(cpr), right[i]) - cpr.begin() + 1;
// cout << left[i] << " " << right[i] << "\n";
}
vector <pair <int, int>> seg;
for(int i = 1; i <= n; i ++) {
seg.pb(make_pair(left[i], right[i]));
}
sort(all(seg), [](pair <int, int>& a, pair <int, int>& b){
if(a.sc != b.sc) return a.sc < b.sc;
return a.fr < b.fr;
});
int r = 0, ans = 0;
for(auto x : seg){
if(r < x.fr){
r = x.sc;
ans ++;
}
}
cout << ans;
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
// if(fopen("nameholder.inp", "r")){
// freopen("nameholder.inp", "r", stdin);
// freopen("nameholder.out", "w", stdout);
// }
// cout << 1; return 0;
ll n = 1;
// cin >> n;
while(n) {
solve();
n --;
cout << "\n";
}
// cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
return 0;
}
// ++++
// ++++-::......:--:::-=+++
// ++++=:............---.....--:..:=++++++
// +++++++::......................::=+++++
// @@ ++++++++++:+++++++++
// @% @*
// %%@@ *****#*@@
// %%%%% @##**##***%
// @@@@@@+-*#*@ #####%+*##*@
// %#+@%%@@@ ##-%:::-#*###@@
// =====:*::: ###-:==::=#*%*
// -====:::::+@@%@@%@#*--=*#%%#@%@ @%@
// @=====%=-@%=:::.:+-::::+::::::::::::%-----%% @@@@@
// @@%#*@++%===+::-================@%@@@@+++++++@@@%%%@#%###%
// @#***#@@ @##=%@===+--:+==+===+%*##@%%%@@@@@@@@@@:= @%@%%%@#%%
// -@ @*#@ #####%:::-====+:::==---**%#@ *%%%%@@@@@@-:
// -=-*% # #***--%%::::::::+=-+#-----=**@*# #+**#@#
// ----=----#+****=----=*#@=::::::=#-----------***%*%
// ------------%*****##=@==::::::+%-----------***%**
// +-----------------*@++%::::::::-----------****@*#
// =------------% @%=+%#+:::::::* #-----*--**** **
// ----%--% *==+++++=+=##*:% ---=--**** **
// %@@@@@@@@@==@+%%%%@ ----**** *#
// @=*+%@@@%@@=++=:%:::% #***@@#
// #+++++++++#==++-:::::: @**** *#
// =+++++++++++==+++::::::: ####@ #%
// +++++++++++=@ @++++::::::@ @#
// @+++++++++=@ =*++=:::::@
// ++++++++@ @++++:::::
// ++++++= =++++:::
// =+++++@ =+++::::
// ++++++-@ =+++:+::
// @::+::::@ =++::-:::
// +::=::::: @+*+:-+++-:
// @::+-:::::# +++::::::@
// ::%=:::::::%@ @%++::::***
// @:+@*:::::::****@ +@+++:-=*:*@
// *:@@%::::::::=**** @%@+++:::#**@
// *%@@@-:::::::%=+==*@ +@%+++:***+*
// #%@@%%::::::::#+=-=# =+@+++++:::*+
// @####+::::::::%+=@#%#=@ @**@@%=++::::@
// @ +:::::::::***#*@ @@###+=+=%@ +**#+=+*+:::-
// =-:::::::%%%%@@ @#=*########%#+*%%+--@*+::%
// +---%@ @@ =-:-**:#
// %%%%% @+--*@
// @%%%%@ @%%%%%
// @%%@@
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |