Submission #29661158


Source Code Expand

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<bitset>
#include<unordered_map>
#include<functional>
#include<map>
#include<iomanip>
#include<limits>
#include<unordered_set>
#include<cmath>
#include <numeric>
#include <array>
#include<utility>
#include <complex>
using namespace std;
#pragma region define
#define M_PI 3.141592653589793238
#define upperbound(v,val) upper_bound(v.begin(),v.end(),val)-v.begin()
#define lowerbound(v,val) lower_bound(v.begin(),v.end(),val)-v.begin()
#define int long long
#define vel vector<long long>
#define vvel vector<vel>
#define rep(i,n) for(int i=0;i<n;i++)
#define sor(v) sort(v.begin(),v.end())
#define mmax(a,b) a=max(a,b)
#define mmin(a,b) a=min(a,b)
#define mkp(a,b) make_pair(a,b)
#define pin pair<int,int>
#define qin pair<pin,int>
#define V vector
#define Endl endl
#define veb vector<bool>
#define fcout cout << fixed << setprecision(15)
#define rev(s) reverse(s.begin(),s.end())
#define lower(h,val) (lower_bound(h.begin(),h.end(),val)-h.begin())
#define upper(h,val) (upper_bound(h.begin(),h.end(),val)-h.begin())
#define vveb V<veb>
#define omajinai cin.tie(0);ios::sync_with_stdio(false);
#define endl "\n"
#define pb push_back
#pragma endregion
int root(int x, vel& pa) {
	if (pa[x] == -1) { return x; }
	int ans = root(pa[x], pa); pa[x] = ans;
	return ans;
}
bool mar(int x, int y, vel& pa) {
	x = root(x, pa);
	y = root(y, pa);
	if (x != y) { pa[x] = y; }
	return (x != y);
}
int gcd(int x, int y) {
	if (x < y) { return gcd(y, x); }
	if (y == 0) { return x; }
	return gcd(y, x % y);
}
int lcm(int x, int y) {
	x = abs(x); y = abs(y);
	return x * (y / gcd(x, y));
}
long long modinv(long long a, long long m) {
	long long b = m, u = 1, v = 0;
	while (b) {
		long long t = a / b;
		a -= t * b; swap(a, b);
		u -= t * v; swap(u, v);
	}
	u %= m;
	if (u < 0) u += m;
	return u;
}
vel dijk(V<V<pin>> way, int st, int inf) {
	int n = way.size();
	vel dist(n, inf); dist[st] = 0;
	priority_queue<pin, vector<pin>, greater<pin>> pq;
	pq.push(mkp(0, st));
	veb is_checked(n, false);
	while (!pq.empty()) {
		pin x = pq.top(); pq.pop();
		int pot = x.second;
		if (!is_checked[pot]) {
			is_checked[pot] = true;
			for (auto y : way[pot]) {
				int nex_dist = x.first + y.second;
				int nex_pot = y.first;
				if (dist[nex_pot] > nex_dist) {
					dist[nex_pot] = nex_dist;
					pq.push(mkp(nex_dist, y.first));
				}
			}
		}
	}
	return dist;
}
V<V<pin>> make_w(vvel v) {
	int n = v.size();
	V<V<pin>> ret(n);
	rep(i, n) {
		for (int x : v[i]) {
			ret[i].push_back(mkp(x, 1));
		}
	}
	return ret;
}
void make_tree(vvel& chi, vel& par, int n) {
	V<V<pin>> way(n);
	rep(i, n - 1) {
		int a, b; cin >> a >> b; a--; b--;
		way[a].push_back(mkp(b, 1));
		way[b].push_back(mkp(a, 1));
	}
	vel dist = dijk(way, 0, n + 1);
	par = vel(n, -1);
	chi = vvel(n);
	rep(i, n) {
		for (auto nex : way[i]) {
			int pot = nex.first;
			if (dist[pot] > dist[i]) { chi[i].push_back(pot); }
			else { par[i] = pot; }
		}
	}
}
void pri(vel& v) {
	if (v.size() == 0) { return; }
	cout << v[0];
	rep(i, v.size() - 1) { cout << " " << v[i + 1]; }
	cout << endl;
	return;
}
vvel disj_min(vel& v) {
	int n = v.size();
	vvel ret(22, vel(n));
	ret[0] = v;
	rep(i, 21) {
		rep(j, n) {
			int nex = j + (1 << i);
			if (nex < n) {
				ret[i + 1][j] = min(ret[i][j], ret[i][nex]);
			}
			else {
				ret[i + 1][j] = ret[i][j];
			}
		}
	}
	return ret;
}
int find_min(vvel& dv, int l, int r) {
	int i = 21;
	while (l + (1 << i) > r) {
		i--;
	}
	while (i >= 0) {
		if (dv[i][l] > dv[i][r - (1 << i)]) {
			l = r - (1 << i);
		}
		else {
			r = l + (1 << i);
		}
		i--;
	}
	return l;
}
V<V<pin>> dbl(V<pin>& v) {
	V<V<pin>> ans(20, V<pin>(v));
	int n = v.size();
	rep(i, 19) {
		rep(j, n) {
			ans[i + 1][j].first = ans[i][ans[i][j].first].first;
			ans[i + 1][j].second = max(ans[i][j].second, ans[i][ans[i][j].first].second);
		}
	}
	return ans;
}
int lca(int s, int t, int diff, V<V<pin>>& pa) {
	if (diff < 0) { return lca(t, s, -diff, pa); }
	int ans = 0;
	rep(i, 19) {
		if ((diff & (1 << i)) != 0) {
			mmax(ans, pa[i][s].second);
			s = pa[i][s].first;
		}
	}
	for (int i = 19; i >= 0; i--) {
		if (pa[i][s] != pa[i][t]) {
			mmax(ans, pa[i][s].second);
			s = pa[i][s].first;
			mmax(ans, pa[i][t].second);
			t = pa[i][t].first;
		}
	}
	if (s != t) {
		mmax(ans, pa[0][s].second);
		mmax(ans, pa[0][t].second);
	}
	return ans;
}
void alp(int n, vel& pr) {
	for (int i = 2; i * i <= n; i++) {
		if (n % i == 0) {
			pr.push_back(i);
			while (n % i == 0) { n /= i; }
		}
	}
	if (n != 1) { pr.push_back(n); }
}
vel dx = { 0,0,-1,1 };
vel dy = { 1,-1,0,0 };
#define all(a) a.begin(),a.end()
template<typename T>
void mk_uni(V<T>& a) {
	std::sort(a.begin(), a.end());
	a.erase(std::unique(a.begin(), a.end()), a.end());
}
#include <cstdint>

template <std::uint_fast64_t Modulus> class modint {
	using u64 = std::uint_fast64_t;

public:
	u64 a;

	constexpr modint(const u64 x = 0) noexcept : a(x% Modulus) {}
	constexpr u64& value() noexcept { return a; }
	constexpr const u64& value() const noexcept { return a; }
	constexpr modint operator+(const modint rhs) const noexcept {
		return modint(*this) += rhs;
	}
	constexpr modint operator-(const modint rhs) const noexcept {
		return modint(*this) -= rhs;
	}
	constexpr modint operator*(const modint rhs) const noexcept {
		return modint(*this) *= rhs;
	}
	constexpr modint operator/(const modint rhs) const noexcept {
		return modint(*this) /= rhs;
	}
	constexpr modint& operator+=(const modint rhs) noexcept {
		a += rhs.a;
		if (a >= Modulus) {
			a -= Modulus;
		}
		return *this;
	}
	constexpr modint& operator-=(const modint rhs) noexcept {
		if (a < rhs.a) {
			a += Modulus;
		}
		a -= rhs.a;
		return *this;
	}
	constexpr modint& operator*=(const modint rhs) noexcept {
		a = a * rhs.a % Modulus;
		return *this;
	}
	constexpr modint& operator/=(modint rhs) noexcept {
		u64 exp = Modulus - 2;
		while (exp) {
			if (exp % 2) {
				*this *= rhs;
			}
			rhs *= rhs;
			exp /= 2;
		}
		return *this;
	}
};

using mint = modint<998244353>;

using vem = vector<mint>;
using vvem = vector<vem>;
#pragma region mint
vem kai, inv_kai;
void make_kai(int n) {
	kai = vem(n + 1, 1);
	inv_kai = vem(n + 1, 1);
	rep(i, n) { kai[i + 1] = kai[i] * (i + 1); }
	inv_kai[n] = (mint)1 / kai[n];
	for (int i = n; i > 0; i--) { inv_kai[i - 1] = inv_kai[i] * i; }
}
mint mpow(mint a, int n) {
	mint ans = 1;
	while (n) {
		if (n & 1) { ans *= a; }
		a *= a; n /= 2;
	}
	return ans;
}
mint com(int n, int r) {
	if (n < 0 || r < 0 || n < r) { return 0; }
	return kai[n] * inv_kai[r] * inv_kai[n - r];
}
mint per(int n, int r) {
	if (n < 0 || r < 0 || n < r) { return 0; }
	return kai[n] * inv_kai[r];
}
#pragma endregion
struct io_init {
	io_init() {
		cin.tie(nullptr); cout.tie(nullptr);
		std::ios::sync_with_stdio(false);
	}
} io_init;
int sz = (1 << 19);
int ide = 1234567890;
vel seg(sz * 2, ide);
int bina(int a, int b) { return min(a, b); }
void cha(int pot, int val) {
	pot += sz;
	seg[pot] = val; pot >>= 1;
	while (pot != 0) {
		seg[pot] = bina(seg[2 * pot], seg[2 * pot + 1]); pot >>= 1;
	}
}
int cal(int l, int r) {//[l,r)
	l += sz; r += sz;
	int ans = ide;
	while (l < r) {
		if (l & 1) { ans = bina(ans, seg[l]); l++; }
		if (r & 1) { r--; ans = bina(ans, seg[r]); }
		l >>= 1; r >>= 1;
	}
	return ans;
}
vvel all_way;
vvel dist(9,vel(9,0));
int val(vel& board, vel way) {
	rev(way);
	int ans = board[way.back()];
	way.pop_back();
	while (!way.empty()) {
		int op = board[way.back()];
		way.pop_back();
		int num = board[way.back()];
		way.pop_back();
		if (op == 1) { ans += num; }
		else if (op == 2) { ans -= num; }
		else { ans *= num; }
	}
	return ans;
}
map<pair<vel,pin>, pair<vel,pin>> opt_nex;
int cost(int cnt, vel board, int cursor) {
	int ans = 1e8;
	if (cnt == 11) {
		return 0;
	}
	int aim = cnt * (cnt + 1) / 2;
	vel ans_way = {};
	for (vel way : all_way) {
		if (val(board, way) == aim) {
			vel new_board = board;
			for(int x:way) {
				new_board[x]++;
				if (x % 2 == 1) { new_board[x] %= 3; }
			}
			int c = dist[cursor][way[0]]+way.size()+cost(cnt + 1, new_board, way.back());
			if (ans > c) {
				ans = c;
				ans_way = way;
				opt_nex[mkp(board, mkp(cnt, cursor))] = mkp(new_board, mkp(cnt + 1, way.back()));
			}
		}
	}
	/*if (ans < 1e7) {
		cout << "board is ";
		pri(board);
		cout << "cost is";
		cout << ans << " ";
		pri(ans_way);
		cout << endl;
	}*/
	return ans;

}
void dfs(int st, vel& way,veb &visit,vvel &nex) {
	if (way.size() % 2 == 1) {
		all_way.push_back(way);
	}
	for (int to : nex[st]) {
		if (!visit[to]) {
			way.push_back(to);
			visit[to] = true;
			dfs(to, way,visit, nex);
			way.pop_back();
			visit[to] = false;
		}
	}
}
signed main() {
	int n = 10;
	vel a(n);
	rep(i, n) { cin >> a[i]; }
	cout << a[a[a[0]]] << endl;
	/*vvel nex(9);
	rep(i, 3) {
		rep(j, 3) {
			rep(l, 4) {
				int di = i + dx[l];
				int dj = j + dy[l];
				if (0 <= di && di < 3 && 0 <= dj && dj < 3) {
					nex[3 * i + j].push_back(3 * di + dj);
				}
			}
			rep(s, 3) {
				rep(t, 3) {
					dist[3 * i + j][3 * s + t] = max(abs(i - s),abs(j - t));
				}
			}
		}
	}
	for (int i = 0; i < 9; i += 2) {
		vel v = {i};
		veb visit(9, false); visit[i] = true;
		dfs(i, v,visit,nex);
	}
	vel board(9, 1);
	cout << cost(1, board, 4) << endl;
	auto fi = mkp(board, mkp(1, 4));
	rep(_, 9) {
		fi = opt_nex[fi];
		vel w = fi.first;
		rep(i, 3) {
			rep(j, 3) {
				if ((i + j) % 2 == 0) {
					cout << w[3 * i + j] << " ";
				}
				else {
					if (w[3 * i + j] == 0) { cout << "* "; }
					if (w[3 * i + j] == 1) { cout << "+ "; }
					if (w[3 * i + j] == 2) { cout << "- "; }
				}
			}
			cout << endl;
		}
		cout << "cursor is " << fi.second.second << endl;
	}*/
	return 0;
}


Submission Info

Submission Time
Task A - Digit Machine
User b2563125
Language C++ (Clang 10.0.0)
Score 100
Code Size 10198 Byte
Status AC
Exec Time 16 ms
Memory 10844 KiB

Compile Error

./Main.cpp:22:9: warning: 'M_PI' macro redefined [-Wmacro-redefined]
#define M_PI 3.141592653589793238
        ^
/usr/include/math.h:777:10: note: previous definition is here
# define M_PI           3.14159265358979323846  /* pi */
         ^
1 warning generated.

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 3
AC × 10
Set Name Test Cases
Sample example0.txt, example1.txt, example2.txt
All 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, example0.txt, example1.txt, example2.txt
Case Name Status Exec Time Memory
000.txt AC 11 ms 10604 KiB
001.txt AC 11 ms 10844 KiB
002.txt AC 12 ms 10728 KiB
003.txt AC 9 ms 10728 KiB
004.txt AC 11 ms 10612 KiB
005.txt AC 9 ms 10684 KiB
006.txt AC 10 ms 10672 KiB
example0.txt AC 10 ms 10828 KiB
example1.txt AC 10 ms 10680 KiB
example2.txt AC 16 ms 10776 KiB