Submission #570685

#TimeUsernameProblemLanguageResultExecution timeMemory
570685nayhzJakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
492 ms112756 KiB
// hkoi AP152 Jakarta Skyscrapers
#include <bits/stdc++.h>
#define lck cout << "ick bmi 32.9\n"
#define cam_cs cout << "ick orz\n"
#define orz(x) cout << (x) << " orz\n"

#define pii pair<int, int>
#define pll pair<long long, long long>
#define pcc pair<char, char>
#define ll long long
#define ull unsigned long long
#define ld long double
#define int long long

#define vi vector<int>
#define vll vector<long long>
#define vd vector<double>
#define vpii vector<pair<int, int>>
#define vpll vector<pair<long long, long long>>

#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define SET(x, a) memset((x), a, sizeof (x))

#define yes() cout << "YES\n"
#define no() cout << "NO\n"
#define impossible() cout << "Impossible\n"

#define inf 0x3f

template<typename T, typename V>
inline void print (const std::pair<T, V> &x) {std::cout << x.first << ' ' << x.second << '\n';}
template<typename T>
inline void print (const T &x) {std::cout << x << '\n';}
template<typename T>
inline void print (std::vector<T> &x) {for (auto &y : x) std::cout << y << " "; std::cout << '\n';}
inline void print () {std::cout << '\n';}
using namespace std;

ld pi = acos(-1);
ld eps = 1e-9;
ll mod = 1000000007;

inline ll powmod(ll a, ll b) {ll res = 1; a %= mod; for(; b; b >>= 1) {if (b & 1) res = res * a % mod; a = a * a % mod;} return res;}
inline ll hamming (string &a, string &b) {ll ret = 0; for (ll i = 0; i < a.length(); i++) if (a[i] != b[i]) ret++; return ret;}
inline bool isprime (ll x) {if (x == 2) return true; for (ll i = 2; i * i <= x; i++) {if (x % i == 0) return false;}; return true;}
inline double Dist (double x1, double y1, double x2, double y2) {return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));}
inline ll manhattan (ll x1, ll y1, ll x2, ll y2) {return abs(x1 - x2) + abs(y1 - y2);}
clock_t T, NT;
inline double get_time() {NT = clock() - T; return (double)(NT) / CLOCKS_PER_SEC;}

struct dsu {
	int n;
	vector<int> parent;
	vector<int> sz;
	dsu (int _n) : n(_n) {
		parent.resize(n + 5);
		iota(all(parent), 0);
		sz.assign(n, 1);
	}
	inline void init (int _n) {n = _n; parent.resize(n); iota(all(parent), 0); sz.assign(n, 1);}
	inline void init () {iota(all(parent), 0); sz.assign(n, 1);}
	inline int Find (int x) {return parent[x] == x ? x : parent[x] = Find(parent[x]);}
	inline bool Union (int x, int y) {
		x = Find(x), y = Find(y);
		if (x != y) {
			parent[x] = y;
			sz[y] += sz[x], sz[x] = 0;
			return true;
		}
		else return false;
	}
};
struct segment_tree {
	ll n;
	vll a; // 1-based
	vll seg; // 1-based

	segment_tree (int _n) : n(_n) {
		a.resize(n + 5);
		seg.resize(4 * n + 5);
	}
	inline void build (int l, int r, int id = 1) {
		if (l == r) {seg[id] = a[l]; return;}
		ll mid = (l + r) >> 1;
		build(l, mid, id << 1);
		build(mid + 1, r, id << 1 | 1);

		seg[id] = max(seg[id << 1], seg[id << 1 | 1]); // SUBJECT TO CHANGE ACCORDING TO TASK
	}
	inline ll query (int lq, int rq, int l, int r, int id = 1) {
		if (r < lq || rq < l) return -1;
		else if (lq <= l && r <= rq) return seg[id];
		ll mid = (l + r) >> 1;
		ll v1 = query(lq, rq, l, mid, id << 1);
		ll v2 = query(lq, rq, mid + 1, r, id << 1 | 1);
		if (v1 == -1) return v2;
		else if (v2 == -1) return v1;
		else return max(v1, v2); // SUBJECT TO CHANGE ACCORDING TO TASK
	}
};
struct TopoSort {
	int n;
	vi in, ans;
	vector<vi> adj;
	inline void init (int _n) {n = _n; in.assign(n, 0); adj.assign(n, vector<int> (0));}
	inline void conn (int x, int y) {adj[x].push_back(y), ++in[y];}
	inline bool sort () {
		queue<int> q; 
		for (int i = 0; i < n; i++) if (!in[i]) q.push(i);
		while (!q.empty()) {
			int curr = q.front();
			q.pop();
			ans.push_back(curr);
			for (auto &x : adj[curr]) if (!(--in[x])) q.push(x);
		}
		return ans.size() == n;
	}
};
struct Fenwick {
	ll n;
	vll a;
	Fenwick (ll _n): n(_n), a(_n) {}
	void add (ll x, ll val) {
		for (int i = x + 1; i <= n; i += i & -i) a[i - 1] += val;
	}
	ll sum (ll x) {
		ll ans = 0;
		for (int i = x; i >= 1; i -= i & -i) ans += a[i - 1];
		return ans;
	}
	ll range_sum (ll l, ll r) {return sum(r) - sum(l);}
};

/*
>>>>>>>>>>>>>>>>>>>>>>>>>>END OF TEMPLATE HEADER<<<<<<<<<<<<<<<<<<<<<<<<
*/

pii a[30005];
vi adj[30005];
bitset<30005> visited[30005];

void solve (int &tc) {
	int n, m; cin >> n >> m;
	int s, e;
	SET(visited, false);

	for (int i = 0; i < m; i++) {
		cin >> a[i].fi >> a[i].se;
		if (!i) s = a[i].fi;
		if (i == 1) e = a[i].fi;

		if (0 <= a[i].fi + a[i].se && a[i].fi + a[i].se < n) adj[a[i].fi].push_back(a[i].se);
		if (0 <= a[i].fi - a[i].se && a[i].fi - a[i].se < n) adj[a[i].fi].push_back(-a[i].se);
	}

	queue<pair<int, pii>> q;
	q.push({s, {0, 0}});
	pair<int, pii> curr;
	while (!q.empty()) {
		curr = q.front();
		q.pop();

		if (curr.fi == e) {
			print((curr.se.fi));
			return;
		}

		if (0 <= curr.fi + curr.se.se && curr.fi + curr.se.se < n && !visited[curr.fi][curr.fi + curr.se.se]) {
			q.push({curr.fi + curr.se.se, {curr.se.fi + 1, curr.se.se}});
			visited[curr.fi].set(curr.fi + curr.se.se);
		}
		
		for (auto &x : adj[curr.fi]) {
			if (x && !visited[curr.fi][curr.fi + x]) q.push({curr.fi + x, {curr.se.fi + 1, x}}), visited[curr.fi].set(curr.fi + x);
		}
	}
	print((-1));
}

signed main () {
	cin.tie()->sync_with_stdio(false);
	T = clock();
	srand(time(NULL));
	
	int t = 1;
	// cin >> t;
	for (int i = 1; i <= t; i++) {
		solve(i);
		// if (i != t) cout << '\n';
	}
	// while (true) {solve(t); t++;}
	return 0;
}

// g++ -std=c++17 file_name.cpp -o file_name

/* stuff you should look for
	* int overflow, array bounds
	* special cases (n=1?)
	* do smth instead of nothing and stay organized
	* WRITE STUFF DOWN
	* DON'T GET STUCK ON ONE APPROACH
*/

Compilation message (stderr)

skyscraper.cpp: In function 'long long int hamming(std::string&, std::string&)':
skyscraper.cpp:47:72: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 | inline ll hamming (string &a, string &b) {ll ret = 0; for (ll i = 0; i < a.length(); i++) if (a[i] != b[i]) ret++; return ret;}
      |                                                                      ~~^~~~~~~~~~~~
skyscraper.cpp: In member function 'bool TopoSort::sort()':
skyscraper.cpp:119:21: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
  119 |   return ans.size() == n;
      |          ~~~~~~~~~~~^~~~
skyscraper.cpp: In function 'void solve(long long int&)':
skyscraper.cpp:25:44: warning: 'void* memset(void*, int, size_t)' clearing an object of non-trivial type 'class std::bitset<30005>'; use assignment or value-initialization instead [-Wclass-memaccess]
   25 | #define SET(x, a) memset((x), a, sizeof (x))
      |                                            ^
skyscraper.cpp:148:2: note: in expansion of macro 'SET'
  148 |  SET(visited, false);
      |  ^~~
In file included from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:66,
                 from skyscraper.cpp:2:
/usr/include/c++/10/bitset:751:11: note: 'class std::bitset<30005>' declared here
  751 |     class bitset
      |           ^~~~~~
skyscraper.cpp:166:3: warning: 'e' may be used uninitialized in this function [-Wmaybe-uninitialized]
  166 |   if (curr.fi == e) {
      |   ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...