Submission #1085465

#TimeUsernameProblemLanguageResultExecution timeMemory
1085465I_am_Polish_GirlAdvertisement 2 (JOI23_ho_t2)C++14
100 / 100
504 ms57792 KiB
#pragma target("arch=icelake-server")

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <stack> 
#include <queue>
#include <cmath>
#include <random>
#include <chrono>
#include <iomanip>
#include <bitset>

using namespace std;

#define int long long

typedef long long ll;
typedef long double ld;

int log_ = 21;
int inf = 4000000007000000007;

long long mod = 998244353;

int p = 499;

int NADIYA = 39;

struct segment_tree
{
	vector <int> tree;

	int s = 1;

	void init(int n)
	{
		s = 1;

		while (s < n)
			s *= 2;

		tree.resize(2 * s , -inf);
	}

	void modif(int ind, int l, int r , int indx , int x)
	{
		if(r - l == 1)
		{
			tree[ind] = max(tree[ind], x);
			return;
		}

		int m = (l + r) / 2;

		if (indx < m)
			modif(ind * 2 + 1, l, m, indx, x);
		else
			modif(ind * 2 + 2, m, r, indx, x);

		tree[ind] = max(tree[ind * 2 + 1], tree[ind * 2 + 2]);
	}

	void modif(int indx, int x)
	{
		modif(0, 0, s, indx, x);
	}

	int get(int ind, int l, int r, int lx, int rx)
	{
		if ((lx <= l) and (r <= rx))
		{
			return tree[ind];
		}

		if ((rx <= l) or (r <= lx))
			return -inf;

		int m = (l + r) / 2;

		int g1 = get(ind * 2 + 1, l, m, lx, rx);
		int g2 = get(ind * 2 + 2, m, r, lx, rx);

		return max(g1, g2);
	}

	int get(int lx, int rx)
	{
		return get(0, 0, s, lx, rx);
	}

};

bool cmp(pair <int, int> a, pair <int, int> b)
{
	if (a.second > b.second)
	{
		return true;
	}

	return false;
}

signed main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int n;
	cin >> n;

	vector <pair <int, int>> vp(n);

	for (int i = 0; i < n; i++)
		cin >> vp[i].first >> vp[i].second;

	sort(vp.begin(), vp.end(), cmp);

	vector <pair <int, int>> vp_;

	for (int i = 0; i < n; i++)
	{
		vp_.push_back({ vp[i].first , i });
	}

	sort(vp_.begin(), vp_.end());

	int c = 0;

	vector <int> x(n);

	for (int i = 0; i < n; i++)
	{
		if (i > 0)
		{
			if (vp_[i - 1].first != vp_[i].first)
				c++;
		}

		x[vp_[i].second] = c;
	}

	c++;

	vector <int> y(c);
	for (int i = 0; i < n; i++)
	{
		y[x[i]] = vp[i].first;
	}

	vector <int> p1(c);

	for (int i = 0; i < c; i++)
	{
		p1[i] = y[i];
	}

	vector <int> p2(c);

	for (int i = 0; i < c; i++)
	{
		p2[i] = -y[i];
	}

	segment_tree st1;
	segment_tree st2;

	st1.init(c);
	st2.init(c);

	int ans = 0;

	for (int i = 0; i < n; i++)
	{
		int p = vp[i].first;
		int e = vp[i].second;

		int g = st1.get(0, x[i] + 1);
		
		g -= p1[x[i]];

		if (g >= e)
		{
			continue;
		}

		g = st2.get(x[i] , c);

		g -= p2[x[i]];

		if (g >= e)
		{
			continue;
		}

		ans++;

		st1.modif(x[i], e + p1[x[i]]);
		st2.modif(x[i], e + p2[x[i]]);
	}

	cout << ans;
}

/*5
1 2 1
2 3 1
2 4 1
1 5 4
*/

Compilation message (stderr)

Main.cpp:1: warning: ignoring '#pragma target ' [-Wunknown-pragmas]
    1 | #pragma target("arch=icelake-server")
      | 
Main.cpp: In function 'int main()':
Main.cpp:180:7: warning: unused variable 'p' [-Wunused-variable]
  180 |   int p = vp[i].first;
      |       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...