E๋ฒ์ด ๊ฑฐ์ ์ฌ์ด C๊ธ์ผ๋ก ์ฌ์ด ์ด์ํ ๋ผ์ด๋์ด๋ค.
ํ๋ค๊ฐ ๋์ฌ๋ณด๋์์ ๋ง์ ์ฌ๋ ์๋ฅผ ํ์ธํ์ง ์์๋ค๋ฉด ์๋นํ ๋ญํจ๋ฅผ ๋ณผ ๋ป ํ๋ค.
A๋ฒ ๋ฌธ์ : ๊ตฌํ
$[s, e]$๊ตฌ๊ฐ์ด ์ฟผ๋ฆฌ๋ก ์ฃผ์ด์ง๋๋ฐ, ์ฌ๊ธฐ์ $d$์ ๋ฐฐ์์ธ ๊ฒ ์ค $[s, e]$์ ํฌํจ๋์ง ์๋ ์ต์๊ฐ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋๋ฉด ๊ฐ๋จํ๋ค.
$d < s$์ธ ๊ฒฝ์ฐ ๊ทธ๋ฅ $d$ ์์ฒด๊ฐ ๋ต์ด๋ค.
์๋ ๊ฒฝ์ฐ $e < i \cdot d$ ์ค ๊ฐ์ฅ $i \cdot d$๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
i64 s, e, x;
void input() {
cin >> s >> e >> x;
}
int solve() {
if(x < s) {
cout << x << ENDL;
return 0;
}
i64 d = e/x;
if(x*d <= e) {
cout << x*(d+1) << ENDL;
} else {
cout << x*d << ENDL;
}
return 0;
}
// ................. main .................. //
void execute() {
int TT; cin >> TT;
while(TT--)
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
B๋ฒ ๋ฌธ์ : ๊ตฌํ
๊ทธ๋ฆฌ๋
์์ฝ๋์ธ์ [:||||:]
ํํ์ด๋ค.
์ฆ, [:
๊ณผ :]
์ฌ์ด์ |
์ด 0๊ฐ ์ด์ ๋ค์ด๊ฐ์๋ ๊ตฌ์กฐ์ด๋ค.
๋ฌธ์์ด์ด ํ๋ ์ฃผ์ด์ง๋๋ฐ, ์ฌ๊ธฐ์ ์ํ๋ ๋งํผ ๋ฌธ์๋ฅผ ์ง์ธ ๋ ๋ง๋ค ์ ์๋ ์์ฝ๋์ธ์ ์ต๋ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
B๋ฒ ๋ฌธ์ ์น๊ณ ์กฐ๊ธ ์๊ฐ์ ํด์ผ ํ๊ณ ๊ตฌํ๋ ๊ณ ๋ คํด์ผ ํ ์ ์ด ๋ง์ ๋ฌธ์ ์ด๋ค.
ํ์ง๋ง ์ฒ์ฒํ ์๊ฐํด๋ณด๋ฉด, [
, ]
์ด ์ฌ๋ฌ๊ฐ ๋ฑ์ฅํ๋ค๊ณ ํ์ ๋ ๊ฐ์ฅ ์ธ๊ณฝ์ [ ]
๋ฅผ ๋จ๊ฒจ๋๋๊ฒ ๋ฌด์กฐ๊ฑด ์ด๋์ด๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
::
์ ๊ฒฝ์ฐ์๋ ์์์ ๊ตฌํ [ ]
๋ด์์ ๊ฐ์ฅ ์ธ๊ณฝ์ ์๋ ๊ฒ์ ๋จ๊ฒจ๋๋๊ฒ ๋ฌด์กฐ๊ฑด ์ด๋์ด๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๊ตฌํ ::
์์ ์๋ |
์ ๊ฐ์๋ฅผ ์ธ์ ๊ฐ์ฅ ๊ธด ์์ฝ๋์ธ์ ๋ง๋ค๋ฉด ๋๋ค.
๊ตฌํํ ๋ ์กฐ์ฌํด์ผ ํ ์ ์ ์์ฝ๋์ธ์ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
const int MAXN = 5e5+10;
string st;
void input() {
cin >> st;
}
int solve() {
int s = -1, e = -1;
FOR(i, 0, st.size()) {
if(s == -1 && st[i] == '[') s = i;
}
RFOR(i, st.size()-1, 0) {
if(e == -1 && st[i] == ']') e = i;
}
if(s == -1 || e == -1 || s >= e) {
cout << -1 << ENDL;
return 0;
}
int cnt = 0;
int ss = -1, ee = -1;
FOR(i, s, e+1) {
if(ss == -1 && st[i] == ':') ss = i;
}
RFOR(i, e, s) {
if(ee == -1 && st[i] == ':') ee = i;
}
if(ss == ee) {
cout << -1 << ENDL;
return 0;
}
int ans = 4;
FOR(i, ss, ee+1) {
if(st[i] == '|') ++ans;
}
cout << ans << ENDL;
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
C๋ฒ ๋ฌธ์ : ๊ตฌํ
๊ทธ๋ฆฌ๋
$n$๊ฐ์ $[s_i, e_i]$ ์ธ๊ทธ๋จผํธ๊ฐ ์ฃผ์ด์ง๊ณ , ์ฐ๋ฆฌ๋ ์ด๊ฒ๋ค์ ๋ ๊ฐ์ ๋น์ด์์ง ์์
๊ทธ๋ฃน์ผ๋ก ๋ถ๋ฅํด์ผ ํ๋ค.
๋จ, ์๋ก ๋ค๋ฅธ ๊ทธ๋ฃน์ ์ํ ๋ ์ธ๊ทธ๋จผํธ์ ๊ต์ฐจ์ ์ด ์์ด์ผ ํ๋ค.
์ด๋ค ์ธ๊ทธ๋จผํธ $a$์ ๊ฒน์ณ์ง๋ ์ธ๊ทธ๋จผํธ๋ค์ ์งํฉ์ $A$๋ผ๊ณ ํ ๋, $A$๋ ๋ฌด์กฐ๊ฑด ๊ฐ์ ๊ทธ๋ฃน์ ์ํด์ผ ํ๋ค.
๋ํ $A$์ ๊ฒน์ณ์ง๋ ์ธ๊ทธ๋จผํธ ๋ํ $a$์ ๊ฐ์ ๊ทธ๋ฃน์ ์ํด์ผ ํ๊ณ , ์ด๊ฒ์ ๊ฒน์ณ์ง๋ ์ธ๊ทธ๋จผํธ๊ฐ ์์ ๋๊น์ง ๋ฐ๋ณต๋๋ค.
๊ทธ ์ธ์ ์ธ๊ทธ๋จผํธ๋ค์ ๊ฐ์ ๊ทธ๋ฃน์ ์ํ๋ , ๋ค๋ฅธ ๊ทธ๋ฃน์ ์ํ๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
์ด๊ฒ์ ๊ฐ์ฅ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ตฌ๊ฐ์ $s_i$์์ผ๋ก ์ ๋ ฌ ํ ์์๋๋ก ์ํํ๋ฉฐ ์์ ๊ตฌ๊ฐ๊ณผ ๊ฒน์ณ์ง๋ฉด ๋ฌด์กฐ๊ฑด ๊ฐ์ ๊ทธ๋ฃน์, ๊ฒน์ณ์ง์ง ์์ผ๋ฉด ๋ค๋ฅธ ๊ทธ๋ฃน์ ๋ฃ๋ ๊ฒ์ด๋ค.
๋ํ ๋ ๊ทธ๋ฃน์ ๋น์ด์์ง ์์
์ํ์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ํ ์ฒ๋ฆฌ๋ ํด์ผํ๋ ๊ฒ์ ์ฃผ์ํด์ผ ํ๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
const int MAXN = 1e5+10, RANGE = 2e5+10;
int n, ord[MAXN], ans[MAXN];
ii seg[MAXN];
vi g[2];
void input() {
cin >> n;
FOR(i, 0, n) cin >> seg[i].first >> seg[i].se;
}
int solve() {
FOR(i, 0, n) ord[i] = i;
sort(ord, ord + n, [](int u, int v) { return seg[u] < seg[v]; });
int me = -1;
FOR(i, 0, 2) g[i].clear();
int cur = 0;
FOR(j, 0, n) {
int i = ord[j];
if(me < seg[i].fi) {
cur ^= 1;
}
me = max(seg[i].se, me);
g[cur].pb(ord[j]);
ans[ord[j]] = cur;
}
if(g[0].size() && g[1].size()) {
FOR(i, 0, n) cout << ans[i]+1 << ' '; cout << ENDL;
} else {
cout << -1 << ENDL;
}
return 0;
}
// ................. main .................. //
void execute() {
int TT; cin >> TT;
while(TT--)
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
์ด๋ฒ์๋ ๋ฌธ์ ๋ฅผ ์๋ชป ์ฝ์ด ๋ฌด๋ ค 2๋ฒ์ด๋ ์ฝ์งํ๊ณ ์๊ฐ๋ ๋ง์ด ๋ ๋ ค๋จน์๋ค.
๊ฐ์ ๊ทธ๋ฃน
์ ๊ฒน์ณ์ง๋ ์ธ๊ทธ๋จผํธ๊ฐ ๋ค์ด๊ฐ๋ฉด ์ ๋๋ ๊ฑด์ค ์๊ณ fenwick
๋ ์ฌ์ฉํ๋ฉฐ ์ด์ฌํ ๊ตฌํํ๋๋ฐ ๋๋ฌด ํ๋ฌดํ๋ค.
ํนํ ์์ ๊ฐ ์๋ชป ์ฝ์ ๋ฌธ์ ๋ ์๋ ๋ฌธ์ ๋ ๋๊ฐ์ ์ถ๋ ฅ์ด ๋์ค๊ธฐ ๋๋ฌธ์ ์๋ชป์ ์๊ธฐ๊น์ง ๊ฝค ๋ง์ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค.
๋งค ์ฝํฌ ์ปจํ ์คํธ๋ง๋ค ์ด๋ฐ ์ค์๊ฐ ๋์ค๋๋ฐ ์์ผ๋ก๋ ์ข ๋ ๋ฌธ์ ๋ฅผ ์์ธํ ์ฝ์ด์ผ๊ฒ ๋ค.
D๋ฒ ๋ฌธ์ : Math
GCD
ํธ๋ฆฌ
DP
์์ธ์
์ด๋ป๊ฒ ๋๊ฒ D๋ฒ์ด E๋ฒ๋ณด๋ค ์ด๋ ต๋ค.
$n$๊ฐ์ ์ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง๊ณ , ๊ฐ ์ ์ ๋ง๋ค $[1..2 \cdot 10^5]$์ ๊ฐ์ค์น๊ฐ ๋ถ์ฌ๋์ด ์๋ค.
$g(u, v)$๋ $u$์ ์ ์์ $v$์ ์ ๊น์ง์ ๋จ์ ๊ฒฝ๋ก์ ์๋ ์ ์ ๋ค์ gcd
๊ฐ์ ์๋ฏธํ๋ค.
$dist(u, v)$๋ $u$์ ์ ์์ $v$์ ์ ๊น์ง์ ๋จ์ ๊ฒฝ๋ก์ ์๋ ์ ์ ๋ค์ ์๋ฅผ ์๋ฏธํ๋ค.
์ด ๋, $g(u, v) > 1$ ์ธ ๊ฒฝ๋ก๋ค ์ค $dist(u, v)$์ ์ต๋๊ฐ์ ๊ตฌํด์ผ ํ๋ค.
์ฌ๋ฌ ์์ gcd
๊ฐ $2$์ด์์ด๋ผ๋ ์๋ฆฌ๋ ๊ทธ๋ค์ ๊ณตํต๋ ์์ธ์๊ฐ ํ๋๋ผ๋ ์กด์ฌํ๋ค๋ ๊ฒ์ด๋ค.
์ฆ, ๊ณตํต๋ ์์ธ์๊ฐ ๋จ ํ๋๋ผ๋ ์๋ ๊ฒฝ๋ก ์ค ์ต์ฅ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ๊ตฌํด์ผ ํ๋ค..
์ผ๋จ ๊ณตํต ์์ธ์๋ผ๋ ์กฐ๊ฑด ์์ด ์ต์ฅ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๊ฒ์ ๊ฐ๋จํ Tree DP
๋ก ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.
$dp[u] = max(path({sub}_u, u))$
DP๊ฐ์ ์ฑ์ธ ๋๋ Bottom-Up
๋ฐฉ์์ผ๋ก $dp[u] = 1 + max(dp[{child}_u])$๋ก ์ฑ์๋๊ฐ๋ฉด ๋๋ค.
๋ํ ์ค์ ์ต์ฅ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ๋๋ ๋ชจ๋ ์ ์ $u$์์ $dp[{child}_u]$๊ฐ ์ค ๊ฐ์ฅ ํฐ $2$๊ฐ๋ฅผ ๊ณจ๋ผ ๋ํ ๊ฒ๋ค ์ค ์ต๋๊ฐ์ ์ฐพ์ผ๋ฉด ๋๋ค.
(์ฌ์ค DP๊น์ง๋ ํ์ ์์ง๋ง, ๋ค์ ๋ฌธ์ ํด๊ฒฐ์ ์ํด ์ด๋ ๊ฒ ์ ์๋ค.)
ํ์ง๋ง, ์ด ๋ฌธ์ ์์๋ ๊ทธ๋ฐ ๊ฒฝ๋ก ์ค ๊ณตํต๋ ์์ธ์๊ฐ ๋จ ํ๋๋ผ๋ ์์ด์ผํ๋ฏ๋ก, DP๋ฅผ ์ด์ง ์ฌ์ ์ ํด์ผํ ๊ฒ ๊ฐ๋ค.
$dp[u][x]$ = $path({sub}_u, u)$ ์ค $x$๋ฅผ ๊ณตํต ์์ธ์๋ก ํ๋ ์ต๋ ๊ธธ์ด
์ด๋ ๊ฒ ํ๋ฉด ์๊น์ ๋ง์ฐฌ๊ฐ์ง๋ก Bottom-Up
๋ฐฉ์์ผ๋ก ์์ ์ ์ ๋ค์ dp๊ฐ์ ๋ฏธ๋ฆฌ ์ฑ์๋๊ณ , ํ์ฌ $u$์์ $weight[u]$์ ์์ธ์ $x$๋ค์ ๋ํด $dp[u][x] = max(1 + dp[{child}_u][x])$๋ก dp๊ฐ์ ์ ์ ์ฑ์๋๊ฐ๋ฉด ๋๋ค.
์ค์ ์ต์ฅ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ๋์๋ ์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ตฌํ๋ฉด ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ์ ์ ๋ง๋ค ํด๋น ์์ธ์์ ๊ฐ์๋งํผ ์ ์ฅํ ๊ณต๊ฐ์ด ๋์ด๋๋๊น MLE๊ฐ ๋ฐ์ํ์ง๋ ์์๊น?
$2 \cdot 10^5$์ด๋ด์ ์๋ $2 \cdot 3 \cdot 5 \cdot 7 \cdot 11 \cdot 13 \cdot 17 = 510,510$์ด๊ธฐ ๋๋ฌธ์ ์์ธ์๊ฐ ์ต๋ 6๊ฐ ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
๋ํ $2 \cdot 10^5$๊ฐ์ $2 \cdot 10^5$์ด๋ด์ ์์ฐ์๋ฅผ ๋น ๋ฅด๊ฒ ์์ธ์๋ถํด๋ฅผ ํ ์ ์๋ ์๋จ์ด ํ์ํ๋ฐ, ์ด๊ฒ์ ์ด์ ์ ์๊ฐํ๋ ์ค์ผ๋ฌ์ ์ฒด๋ฅผ ํ์ฉํ๋ฉด ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
๋ง์ง๋ง์ผ๋ก $dp[u][x]$๋ฅผ ์ ์งํ๊ฒ ๋ฐฐ์ด๋ก ๊ตฌํํด๋ฒ๋ฆฌ๋ฉด ๋น์ฐํ MLE๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์, map์ผ๋ก ๊ตฌํ์ ํด์ค์ผ ํ๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T> ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T> ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R> ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
const int MAXN = 2e5+10, RANGE = 2e5+10;
int n, ar[MAXN], pn, spf[RANGE], pr[RANGE], par[MAXN], ans;
map<int, int> dp[MAXN];
vi g[MAXN], pf[RANGE];
void input() {
cin >> n;
FOR(i, 0, n) cin >> ar[i];
FOR(i, 0, n-1) {
int u, v; cin >> u >> v; --u, --v;
g[u].pb(v);
g[v].pb(u);
}
}
void eulerSieve() {
FOR(x, 2, RANGE) {
if(!spf[x]) spf[x] = pr[pn++] = x;
for(int j = 0; x*pr[j] < RANGE; ++j) {
spf[x*pr[j]] = pr[j];
if(x % pr[j] == 0) break;
}
}
FOR(i, 2, RANGE) {
int x = i;
while(spf[x]) {
int cur = spf[x];
pf[i].pb(cur);
while(x % cur == 0) x /= cur;
}
}
}
void f(int u) {
for(int v : g[u]) if(par[u] != v) par[v] = u, f(v);
for(int x : pf[ar[u]]) {
int fir = 0, sec = 0;
for(int v : g[u]) {
if(par[v] == u) {
sec = max(sec, dp[v][x]);
if(fir < sec) swap(fir, sec);;
}
}
dp[u][x] = 1+fir;
ans = max(ans, 1 + fir + sec);
}
}
int solve() {
eulerSieve();
memset(par, -1, sizeof(par));
par[0] = MAXN;
f(0);
cout << ans << ENDL;
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
C๋ฒ์์ ์ฃฝ์ ์์ ์ฌ์ ๋ E๋ฒ ์๋ธ ์๋๊ฐ ๋๋ ค์ก๋ค.
๋ฐ๋ผ์ ์ด๋๋ก ๋ผ์ด๋๊ฐ ๋๋๋ฒ๋ฆฌ๋ฉด 700๋ฑ์ด ๋ผ ๋ฒ๋ฆฌ๋๋ฐ, ๋ง์ฝ D๋ฒ์ ๋ฆ๊ฒ๋ผ๋ ํ๋ฉด 200~400๋ฑ๊น์ง๋ ๋ ธ๋ ค๋ณผ๋ง ํ๋ค.
Tree DP
๋ฌธ์ ๋ผ๋ ๊ฒ์ ๊ฐ์ ์ก๊ณ ์์ธ์๋ฅผ ์ด์ฉํ๋ฉด ์ํ๊ณต๊ฐ์ ๋ง์ด ์ค์ผ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์ด์ฌํ ๊ตฌํํ์ง๋ง, ์ค๊ฐ์ DP ์
๋ฐ์ดํธ๋ฅผ ์ค์ํด์ ์๊ฐ ๋ด์ AC๋ฅผ ๋ฐ์ง ๋ชปํด ์์ฌ์ ๋ค.
๊ณ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ โ๋ง๋๋ฐ ์ ํ๋ ธ์ง?โ๋ผ๊ณ ์๊ฐํ๋๋ฐ, ์ฝํฌ๋ฅผ ๋๋ด๊ณ ์ค์๋ฅผ ํ๋ ๋์ค์ DP๊ฐ ์ ๋ฐ์ดํธ์ ans๊ฐ ์ ๋ฐ์ดํธ๋ ๋ฐ๋ก ํด์คฌ์ด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ๋๋ฌด ์์ฌ์ ๋ค.
์ฆ, ๋ด๊ฐ ์ฒ์์ ์งฐ๋ ์ฝ๋๋ ์๋์ ๊ฐ์๋ฐ
...
ans = max(ans, dp[u][x] = 1 + fir + sec);
์ด๋ ๊ฒ ํด๋ฒ๋ฆฌ๋ฉด $dp[u][x]$๋ โ$u$๋ฅผ ์ง๋๊ณ , ๊ณตํต ์์ธ์๊ฐ $x$์ธ ๊ฒฝ๋ก์ ์ต์ฅ๊ธธ์ดโ๊ฐ ๋์ด๋ฒ๋ฆฐ๋ค.
๋ฐ๋ผ์ ์๋์ ๊ฐ์ด $u$์์๋ ์๋ 1๊ฐ์ ๊ฒฝ๋ก ๊ฐ๋ง์ ๋ฐ์์์ผ๋ง ํ๋ค.
...
dp[u][x] = 1+fir;
ans = max(ans, 1+fir+sec);
E๋ฒ ๋ฌธ์ : ๊ตฌํ
๊ทธ๋ฆฌ๋
์ฌ์ธ ๋์ C๋ฒ๊ณผ ๋น์ทํ ์์ค์ ๋ฌธ์ ์ฌ์ ๋นํฉ์ค๋ฌ์ ๋ ๋ฌธ์ ์ด๋ค.
์งํ๊ฐ ์ฌ๋ฌ ์ฅ ์ฃผ์ด์ง๊ณ , ๋ชจ๋ ์งํ๊ฐ ์ง๊ฐ์ ๋ค์ด๊ฐ ์ ์๋์ง ๊ตฌํด์ผํ๋ค.
์งํ์ ์ง๊ฐ์ ๋ชจ๋ ์ง์ฌ๊ฐํ ๋ชจ์์ผ๋ก ๊ฐ๋ก, ์ธ๋ก ๊ธธ์ด๊ฐ ์ฃผ์ด์ง๋ค.
์งํ๋ ์ง๊ฐ์ ํ์ ์์ผ์ ๋ฃ์ ์ ์๊ณ , ๊ฒน์ณ์ง๋ ๋ถ๋ถ์ด ์์ด๋ ์๊ด ์๋ค.
$5 \cdot 10^5$๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ์ฃผ์ด์ง๋๋ฐ, ์ฟผ๋ฆฌ๋ ๋ ์ข ๋ฅ์ด๋ค.
- $+\ x\ y$ : $x \times y$ํฌ๊ธฐ์ ์งํ๋ฅผ ์ถ๊ฐํ๋ค.
- $?\ h\ w$ : $w \times h$ํฌ๊ธฐ์ ์ง๊ฐ์ ํ์ฌ๊น์ง์ ์งํ๊ฐ ๋ชจ๋ ๋ค์ด๊ฐ ์ ์๋์ง ์ถ๋ ฅํ๋ค.
์งํ๋ฅผ ํ์ ์ํค์ง ์๋๋ค๊ณ ์๊ฐํ๋ฉด ๋จ์ํ ํ์ฌ๊น์ง์ ์งํ ์ค $max(x_{i..n})$, $max(y_{i..n})$์ด ์ง๊ฐ์ ๋ค์ด๊ฐ๋์ง๋ฅผ ์์๋ณด๋ฉด ๋๋ค.
ํ์ง๋ง ํ์ ์์ผ์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋๋ฐ, ์ด๊ฒ์ ์งํ๋ ์ง๊ฐ์ด๋ ๋๋ ๋ฐฉํฅ์ ๋ฌด์กฐ๊ฑด $w \leq h$์ธ ๋ฐฉํฅ์ผ๋ก ๋๋๋ก ๊ฐ์ ํ๋ฉด ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ ํ ์ ์๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
int QQ;
void input() {
cin >> QQ;
}
int solve() {
int mx = 0, my = 0;
while(QQ--) {
char typ; cin >> typ;
if(typ == '+') {
int x, y; cin >> x >> y;
if(x > y) swap(x, y);
mx = max(x, mx), my = max(y, my);
} else {
int x, y; cin >> x >> y;
if(x > y) swap(x, y);
if(x >= mx && y >= my) cout << "YES" << ENDL;
else cout << "NO" << ENDL;
}
}
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
C๋ฒ์์ ์ฝ์งํ๋๋ผ ์ด ๋ฌธ์ ๋ฅผ ์ฝ๋ ์๊ฐ์ด ๋๋ ค์ก์ง๋ง, ๋ฌธ์ ๊ฐ ๋๋ฌด ์ฌ์ 6๋ถ๋ง์ ํ์๋ค.
์ฝ๋๋ฅผ ์ง๋ฉด์๋ โ์ ๋ง ์ด๊ฒ ๋ต์ธ๊ฐ? ๋ญ๊ฐ ํจ์ ์ด ์๋๊ฒ ์๋๊ฐ?โ ์ถ์ ์ ๋์๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ด๋ ๊ฒ ๋์ด๋๊ฐ ๋ค์ฃฝ๋ฐ์ฃฝ์ธ ๋ฌธ์ ๋ ์ ๋์์ผ๋ฉด ์ข๊ฒ ๋ค.
F๋ฒ ๋ฌธ์ : DP
Convex Hull Trick
๋ผ์ด๋๊ฐ ๋๋๊ณ ์๋ ๋์ง ์์๋ F๋ฒ์ ๋ดค๋๋ฐ, โ์ต๋๊ฐ์ ์ต์ํโ ํ๋ผ๋ ๋จ์๋ฅผ ๋ณด๊ณ Binary Search
์ธ์ค ์์๋ค.
๊ทธ๋์ ํฑํฌ ํฌ๊ธฐ๊ฐ $x$์ผ ๋ ๋ชจ๋ ํธ๋ญ์ด ๋ชฉ์ ์ง์ ๋์ฐฉํ ์ ์๋? ๋ผ๋ ํ๋จ ํจ์๋ง ๋ง๋ค์ด๋ด๋ฉด ๋ต์ด ๋์ค๋๋ฐ, ๊ทธ ํ๋จ์ ๋ด๊ฐ ์๊ฐํ ๊ฒ์ $O(n \cdot m)$์ ๋ด๋ ค๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ TLE๊ฐ ๋ ๊ฒ ๊ฐ์๋ค.
๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๊ฐ๋์ง ์์ ์์ ์ฒ์๋ถํฐ ๋ค์ ์์ํ์ฌ ํฑํฌ์ ํฌ๊ธฐ๋ ์ฐ๋ฆฌ๊ฐ ๊ฒฐ์ ํ์ง๋ง, ๊ฐ ํธ๋ญ์ ์ดํ ๊ตฌ๊ฐ $[s, e]$์ ์ฐ๋น $c$, ์ถฉ์ ํ์ $r$์ ํฑํฌ์ ํฌ๊ธฐ์ ๋ ๋ฆฝ์ ์ผ๋ก ํญ์ ๊ณ ์ ๋๋ค๋ ์ ๋ณด๋ฅผ ์ด์ฉํ๊ธฐ๋ก ํ๋ค.
๋ํ ํธ๋ญ๋ค์ ํญ์ ํ ์ชฝ ๋ฐฉํฅ(index๊ฐ ์ฆ๊ฐํ๋ ๋ฐฉํฅ)์ผ๋ก๋ง ์ดํ์ ํ๊ณ , ๊ฒน์น๋ ์ดํ๊ตฌ๊ฐ์ด ๋ง๋ค๋ ์ ๋ ์ด์ฉํด๋ณผ๋ง ํ๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ฐ๋ชฉ์ ์ก๋๊ฒ ์ฐ๋น $c$๊ฐ ํธ๋ญ๋ง๋ค ๋ค๋ฅด๋ค๋ ๊ฒ์ธ๋ฐ, ๋๋ ์ ์ด์ ํฑํฌ์ ์ฉ๋ $V$์ ์ง์คํ์ง ์๊ธฐ๋ก ํ๋ค.
๊ทธ ๋์ , ํธ๋ญ์ด $[s, e]$๋ฅผ ์ด๋ ํ ๋ ์ต๋ $r$๋ฒ ๋์ด์ ์ด๋ํ ์ ์๋ค๋ ์ ์ ์ด์ฉํ๊ณ ์ถ์๋๋ฐ, ์ด๊ฒ์ผ๋ก dp ์์ ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ์๋ค.
$dp[s][e][x] = [s..e]$๊ตฌ๊ฐ์ ์ด $x$๋ฒ ์ชผ๊ฐ์ด ์ดํํ๋ค๊ณ ํ์ ๋, ๊ธธ์ด๊ฐ ์ต๋์ธ ๊ตฌ๊ฐ์ด ์ต์์ธ ๊ฐ
์ด๊ฒ์ ๊ตฌํด๋์ผ๋ฉด ๊ฐ ํธ๋ญ๋ง๋ค $c_i \cdot dp[s_i][e_i][r_i+1]$์ด ํ์ํ ์ต์ ํฑํฌ ์ฉ๋์ด๋ฏ๋ก $V$๋ ์ด๊ฒ๋ค์ $max$๊ฐ์ ์ทจํ๋ฉด ์ฝ๊ฒ ๊ตฌํ ์ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ๋ฌธ์ ๋๋ ์ ์ด dp๋ฅผ ์ค์ ๋ก ๊ณ์ฐํ ๋์ธ๋ฐ,
$dp[s][e][x] = min(max(dp[s][j][x-1], dist[i..j]))\ \ \ \ for\ j = [s..e)$
์ด์ ๊ฐ์ด ์ ํ์์ด ๋์จ๋ค.
๊ทธ๋ฌ๋ ์ ํ์ ์์ฒด์์ $O(n)$์ด ๊ฑธ๋ฆฌ๋ฏ๋ก, ์ด ์๊ฐ๋ณต์ก๋๋ $O(n^4)$๊ฐ ๋ผ ๋ฒ๋ฆฐ๋ค.
ํ์ฐฝ ๋ฐฑ์ค์์ USACO
๋ฌธ์ ๋ค์ ํ ๋ ์ ๋ฐ ์ ํ์์ ์ ๋ํ๋๋ฐ ์๊ฐ๋ณต์ก๋๊ฐ ๋๋ฌด ํฐ ๊ฒฝ์ฐ๊ฐ ์์๋๋ฐ, ๊ทธ ๋ ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ด๋ ํธ๋ฆญ์ด Convex Hull Trick
์ด์๋ค.
๊ทธ๋ฌ๋ ๋๋ ์์ง ๊ธฐํ๋ฅผ ๊ณต๋ถํ์ง ์์๊ณ Convex Hull
์ด๋ผ๋ ๋จ์ด๋ง ๋์๋ ์น๊ฐ ๋จ๋ฆฌ๋ ์์ค์ด๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ๊ณต๋ถ๋ฅผ ํ์ง ์๊ณ ๋์ด๊ฐ์๋๋ฐ, ์ด๋ฒ ๋ฌธ์ ๋ ํน์ ๊ทธ๋ฐ๊ฐํ๊ณ ์ด์ง ํํ ๋ฆฌ์ผ์์ Convex
๋ฅผ ๊ฒ์ํด๋ดค๋ค.
์ญ์๋ Convex Hull Trick
์ ์ฌ์ฉํ ๋ฌธ์ ์๊ณ , ์กฐ๋ง๊ฐ ๊ทธ๊ฒ์ ๋ํด์ ์ ๋๋ก ๊ณต๋ถํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค..
ํํ ๋ฆฌ์ผ์ ๋ณด๋ ์ด๊ฒ ์ธ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ์๋๋ฐ ์ค๋ช
์ด ์ ๋๋ก ๋์์์ง ์์ ๊ทธ ๋ฐฉ๋ฒ์ ๋ํด์๋ ๋ชจ๋ฅด๊ฒ ๋ค. (์๋ง Binary Search
๋ฅผ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ๋ค.)
์ด๋ฒ ๋ผ์ด๋๋ ์ ํ์ ์ธ C๋ฒ๊น์ง๋ ์ฝ๊ณ , D๋ฒ์์ ๊ฐ์๊ธฐ ์ด๋ ค์์ง๋ ๋ผ์ด๋์๋ค.
C๋ฒ๊น์ง ๋๋ฆฌ๊ฒ ํ๊ฑฐ๋ ํจ๋ํฐ๋ฅผ ์ข ๋ฐ์ผ๋ฉด 1400๋ฑ ์ ๋๊ฐ ๋๊ณ , ๊ฑฐ๊ธฐ์ D, E, F ์ค ํ ๊ฐ๋ฅผ ํ๋ฉด 200๋ฑ๊ถ์ผ๋ก ๋ค์ด์ฌ ์ ์์๋ค.
A๋ฒ ๋ฌธ์ : ๊ตฌํ
๋จ์ํ ๊ตฌํ ๋ฌธ์ ๋ค.
$n$๊ฐ์ ์์๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์์๋ -1 ํน์ 1์ด๋ค.
๋ํ ์ ๋ ฅ์ผ๋ก $k$๊ฐ ์ฃผ์ด์ง๋ฉฐ, ์ฌ๊ธฐ์ ์ ์ ํ $b$๋ฅผ ์ ํํด $b+i \cdot k$์ ํด๋น๋๋ ์์๋ค์ ๋ชจ๋ ์ง์ ์ ๋ ๋จ์ 1๊ณผ -1์ ๊ฐ์์ ์ฐจ์ด๊ฐ ๊ฐ์ฅ ํฌ๊ฒ ๋ง๋๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์์ผ ํ๋ค.
์ด ๋ $i$๋ ์ ์์ด๋ค (์์, ์์, 0 ๊ฐ๋ฅ)
๋ฌธ์ ์กฐ๊ฑด์ ์ ๋ด์ผ ํ๋๋ฐ, $i$๋ ์, ์, 0 ๋ชจ๋๊ฐ ๊ฐ๋ฅํ ์ ์์ด๋ค.
์ฆ, b๊ฐ ์๋ฌด๋ฆฌ ํฌ๋๋ผ๋ b๋ฅผ ํฌํจํ ๊ทธ ์ด์ , ์ดํ ๋ชจ๋๊ฐ ์ง์์ ธ์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ด๊ฒ๋ง ์กฐ์ฌํ๋ฉด ๋ฌธ์ ์์ ์ค๋ช ๋ ๊ทธ๋๋ก ์๋ฎฌ๋ ์ดํ ํ๋ฉฐ ๋ต์ ์ฐพ์ผ๋ฉด ๋๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
const int MAXN = 1e2;
int n, k, a, b, ar[MAXN];
void input() {
cin >> n >> k;
FOR(i, 0, n) {
cin >> ar[i];
if(ar[i] == 1) ++a;
else ++b;
}
}
int solve() {
int ans = 0;
FOR(i, 0, k) {
int ca = a, cb = b;
for(int j = i; j < n; j += k) {
if(ar[j] == 1) --ca;
else --cb;
}
ans = max(ans, abs(ca-cb));
}
cout << ans << ENDL;
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
B๋ฒ ๋ฌธ์ : ๊ตฌํ
$m$๊ฐ์ $[1..n]$๋ค๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค.
$[1..n]$์์๋ค์ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ ์ ์์ ๋ ์ด ๋ช ๊ฐ์ ๊ทธ๋ฃน์ด ๋์ค๋์ง ๊ตฌํด์ผ ํ๋ค.
๊ทธ๋ฅ ํฌ๊ธฐ $n$์ง๋ฆฌ ๋ฐฐ์ด์ 0์ผ๋ก ์ด๊ธฐํ ํ ํ ๊ฐ ์๊ฐ ๋ช ๋ฒ์ฉ ๋ฑ์ฅํ๋ ์ง๋ฅผ ์ผ ๋ค์ $min(cnt[1..n])$์ ๊ตฌํ๋ฉด ๋๋ค.
๊ทธ๋ฐ๋ฐ ๋๋ ์ฒ์์ ๋ฌธ์ ๋ฅผ ์๋ชป ๋ณด๊ณ ์๋ชป๋ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ์ฝ๋๋ฅผ ์งฐ๊ธฐ ๋๋ฌธ์ ์ด์ํ๊ฒ ๊ตฌํ์ด ๋๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
const int MAXN = 1e5+10;
int n, m, ar[MAXN], vis[MAXN], cc[MAXN];
void input() {
cin >> n >> m;
FOR(i, 0, m) cin >> ar[i];
}
int solve() {
int sta = 0;
string ans;
FOR(i, 0, m) {
++cc[++vis[ar[i]]];
if(cc[sta+1] == n) {
++sta;
ans.pb('1');
} else ans.pb('0');
}
cout << ans << ENDL;
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
C๋ฒ ๋ฌธ์ : ๊ธฐํ
๋ค์๊ณผ ๊ฐ์ด $n$๊ฐ์ ๋ฐ์ง๋ฆ์ด ๊ฐ์ ์๋ค๋ก ๋๋ฌ์์ธ ์์ชฝ์ ์์ด ํ๋ ๋ ์๋ ํํ์ ๊ทธ๋ฆผ์ด ์๋ค.
์ด ๋ ์์ชฝ์ ์์ ๋ฐ์ง๋ฆ $r$์ด ์ฃผ์ด์ก์ ๋ ๋ฐ๊นฅ์ชฝ์ ์์ ๋ฐ์ง๋ฆ์ ๊ตฌํด์ผํ๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๋ฐ๊นฅ์ชฝ ์์ ์ค์ฌ์ ์ด์ผ๋ฉด ์ $n$๊ฐํ์ด ๋์จ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๋ํ ์ $n$๊ฐํ์ $n$๊ฐ์ ์์ชฝ ์ด๋ฑ๋ณ์ผ๊ฐํ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค๋ ๊ฒ์ ์ด์ฉํ๋ฉด ์ผ๊ฐํจ์๋ฅผ ์ด์ฉํด ์์ชฝ ์์ ๋ฐ์ง๋ฆ์ ๊ตฌํ ์ ์๋ค.
์ ๊ทธ๋ฆผ์์ ๋ฐ์ผ๋ก ์ชผ๊ฐ์ง ์ง๊ฐ์ผ๊ฐํ ์ชฝ์ ๋ณด๋ฉด ํ๋์ ๋ณ์ ์ฐ๋ฆฌ๊ฐ ๊ตฌํด์ผ ํ $x$, ์ฐ๋์ ๋ณ์ $x+r$์ด๋ค.
๋ฐ๋ผ์ $(x+r)\cos\theta = x$์ด๊ณ , ์์ ์ ๊ฐํ๋ฉด $x = \frac{r\cdot\cos\theta}{1-\cos\theta}$๊ฐ ๋๋ค.
$\theta$๋ ์ ๋ค๊ฐํ์ ํ ๋ด๊ฐ์ ๋ฐ์ด๋ฏ๋ก ๋ฌธ์ ์์ด ๊ตฌํ ์ ์๋ค.
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
double n, r;
void input() {
cin >> n >> r;
}
int solve() {
double st = 1.0*(n-2)/n/2.0;
double coss = cos(M_PI * st);
cout.precision(10);
cout << r*coss / (1-coss) << ENDL;
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
์ฒ์์ ์ฃผ์ด์ง ๋ฐ์ง๋ฆ $r$์ด ๋ฐ๊นฅ ์์ ๋ฐ์ง๋ฆ์ธ์ค ์๊ณ ๊ตฌํ์ ํ๋ค๊ฐ ์์ ๊ฐ ์ด์ํ๊ฒ ๋์์ ๋นํฉํ๋ค.
๋ํ $\cos(x)$์ $x$๋ฅผ ๋ผ๋์ ํํ($x\pi$)๋ก ์ค์ผ ํ์ง๋ง, ์ค์๋ก $\pi$๋ฅผ ๊ณฑํ์ง ์์ ๊ฐ๋๋ฅผ ์ค๋ฒ๋ ค์ ์ด์ํ ๊ฒฐ๊ณผ๊ฐ ๋์์ ์๊ฐ์ ๋ง์ด ๋ฒ๋ ธ๋ค.
D๋ฒ ๋ฌธ์ : Interactive
๊ทธ๋ฆฌ๋
๋ฌธ์ ๊ฐ ์ฅํฉํ๊ฒ ๊ธธ์ง๋ง, ์ดํด๋ณด๋ฉด ๋ณ๊ฑฐ ์๋ค.
$999\times999$ ํฌ๊ธฐ์ ํ์ด ์ฃผ์ด์ง๊ณ , $1$๊ฐ์ ํน, $666$๊ฐ์ ๋ฃฉ์ ํ์ฌ ์์น๊ฐ ์ฃผ์ด์ง๋ค.
ํน๊ณผ ๋ฃฉ์ ๊ธฐ์กด ์ฒด์ค์๋ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ์์ง์ธ๋ค.
ํน์ ๊ฒฝ์ฐ๋ ํ๋ ์ด์ด๊ฐ ์์ง์ด๋ฉฐ, ํ๋ ์ด์ด๊ฐ ๊ฒ์์ด ์์ํ๋ฉด ์ ์ ์ก๋๋ค.
- ๋ฃฉ์ด ์๋ ๊ณณ์ผ๋ก ๊ฐ์ง ๋ชปํ๋ค.
- ์์ง์ผ ์ ์๋ ๋ฒ์๋ ์ผ๋ฐ ํน์ ๊ฒฝ์ฐ์ ๊ฐ๋ค. (์ํ์ข์ฐ ๋๊ฐ์ ๋ฒ์ 1 ์ด๋ด)
- ๋ฃฉ๊ณผ ๊ฐ์ ํ, ์ด๋ก ๊ฐ ์ ์๋ค. (์ด๋ฐ ๊ฒฝ์ฐ๊ฐ ์ฐ๋ฆฌ์ ์ต์ข ๋ชฉ์ (์ฒดํฌ ๋นํ๊ธฐ)์ด๋ค.)
- ํน์ด ๋ฃฉ์ ์ํด ์ฒดํฌ๋ฅผ ๋นํ ๊ฒฝ์ฐ ํ๋ ์ด์ด๊ฐ ์ด๊ธด ๊ฒ์ผ๋ก ํ๋จํ๋ค.
์ฆ, ๋ค๋ฅธ์ ์ด๋ผ๊ณ ํ๋ค๋ฉด ๋ฃฉ์ ๋จน์ง ๋ชปํ๊ณ , ์ค์ค๋ก ์ฒดํฌ ๋นํ๋ฌ ๊ฐ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋ฃฉ์ ์ดํด๋ณด๋ฉด
๋ฃฉ์ ๊ฒฝ์ฐ๋ ์์คํ ์ด ์์ง์ด๋ฉฐ, ํญ์ ํน์ด ์์ง์ธ ๋ค์ ์์ง์ธ๋ค.
- ํ์ฌ ๋ฃฉ์ ์ขํ๊ฐ ์ด๋ป๋ , ํน๊ณผ ๋ฃฉ์ด ์๋ ์๋ฌด ๋น ๊ณณ์ผ๋ก๋ ์์ง์ผ ์ ์๋ค. (์์ ์ ์์ง์ผ ์๋ ์๋ค.)
- ํน๊ณผ ๊ฐ์ ํ, ์ด๋ก ๊ฐ์ง ๋ชปํ๋ค. (์ฆ, ํน์ด ์ฒดํฌ๋นํ๋ฉด ํ๋ ์ด์ด๊ฐ ์ด๊ธฐ๋๋ฐ, ์ค์ค๋ก ์ฒดํฌ๋ฅผ ํ๋ฌ ๊ฐ์ง ๋ชปํ๋ค.)
์ด ๋, $2000$ํด ์ด๋ด์ ํน์ด ์ฒดํฌ๋นํ๋๋ก ์์ง์ด๋ ๊ฒ์ด ์ฐ๋ฆฌ์ ๋ชฉํ์ด๋ค.
์ธํฐ๋ํฐ๋ธ ๋ฐฉ์์ ์ฐ๋ฆฌ๊ฐ ํน์ ๋ค์ ์ขํ $(x, y)$๋ก ์์ง์ด๋ฉด, ์์คํ ์ด $k$๋ฒ์งธ ๋ฃฉ์ $(x, y)$๋ก ์์ง์๋ค๋ ์ ๋ณด๋ฅผ ์ค๋ค.
๋ฃฉ์ 2๋ฒ ์กฐ๊ฑด ๋๋ฌธ์ ํน์ด ์ค์ค๋ก ๋ฃฉ์ ๋ฒ์๋ก ๋ค์ด๊ฐ์ง ์๋ ํ ์ด ์ข๊ฒ ๋ฃฉ์ด ์์ค์ ์ด๊ธฐ๋ ๊ฒฝ์ฐ๋ ์๋ค.
๋ํ ๋ฃฉ์ ๊ณต๊ฒฉ๋ฒ์์ ๋ค์ด๊ฐ๋ค๊ณ ์๊ฐํ์ง ๋ง๊ณ , ๋ฃฉ์ ์๋ฌด ๊ธฐ๋ฅ๋ ์ ํ๊ณ ์์ง์ด๊ธฐ๋ง ํ๋๋ฐ ํน์ด ๋ฃฉ์ ๊ณต๊ฒฉ๋ฒ์๋ฅผ ๊ฐ๊ณ ๋ฃฉ์ ์ก์ผ๋ฌ ๋ค๋๋ค๊ณ ์๊ฐํด๋ณด์.
์์คํ ์ด ์๋ฆฌํ๊ฒ ํ๋ ์ดํ๋ค๊ณ ๊ฐ์ ํ์ ๋ ๋ฃฉ์๊ฒ ์ ์ ๋ค๊ฐ๊ฐ ๋ ๋๋ง์ ๊ฐ ์๋จ์ด ์์ด์ผ ์ด๊ธธ ์ ์๋ค.
์ด๊ฒ์ ์ํด ๋ฃฉ์ ์๋ฌด ์ขํ๋ก๋ ์ด๋ํ ์ ์๋ค๋ ์ฌ๊ธฐ์ฑ์ ์ง๋๊ณ ์์ง๋ง, ํ ํด์ ํ ๊ฐ์ ๋ฃฉ ๋ฐ์ ์์ง์ด์ง ๋ชปํ๋ค๋ ์ฝ์ ์ ์ด์ฉํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ ค๋ฉด ํน์ด ์ ์ ๋ฃฉ๋ค์ ๋ชฐ์๋ฃ์ด ๋๊ณ ์กฐ์ฌ๊ฐ๋ ๊ฒ์ด ๊ฐ์ฅ ์ด์์ ์ผ ๊ฒ์ด๋ค.
๊ทธ ์ค์์๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ํน์ด ๋งต์ ์ ์ค์$(500, 500)$์์ ์์ํ๋ ๊ฒ์ด๊ณ , ์๋์ ๊ฐ์ด ํ ์ชฝ ๋๊ฐ์ ์ผ๋ก ์์ง์ด๋ฉฐ ์กฐ์ฌ๊ฐ๊ฒ ํ๋ ๊ฒ์ด๋ค.
์ผ๋จ ํ ์ชฝ ๋๊ฐ์ ์ผ๋ก ์ญ ์์ง์ด๋ ๊ฒ์ ์๊ฒ ๋๋ฐ, ๋ค ๋๊ฐ์ ๋ฐฉํฅ ์ค ์ด๋ ๊ณณ์ผ๋ก ์์ง์ฌ์ผ ํ ๊น?
ํด๋น ๋๊ฐ์ ์ผ๋ก ์์ง์ด๊ณ ์๋ค๊ณ ๊ฐ์ ํ ๊ฒฝ์ฐ, ์ต์ ์ ๊ฒฝ์ฐ๋ ์์คํ ์ด ์กฐ์ฌ์ง๋ ๋ฒ์ ๋ด์ ๋ฃฉ๋ค์ ๋ชจ๋ ๋๊ฐ์ ์ ๋ฐ๋๋ฐฉํฅ์ผ๋ก ์ด๋์์ผ๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ค.
์ฆ, ๊ทธ๋ฆผ์์ ํ๋์ ๋ถ๋ถ์ ๋๊ฐ์ ๋ฐ๋ ๋ฐฉํฅ์ ํฐ์์ผ๋ก ์์ง์ด๋ ๊ฒฝ์ฐ์ด๋ค.
์ด๋ฐ ์ต์ ์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ๋ฉด, ํ๋ ์ด์ด๋ ํน์ ์ต๋ํ ์กฐ์ฌ์ง๋ ๋์ ๋ฃฉ์ด ๋ง์ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์์ง์ฌ์ผ ํ๋ค.
์ฆ, ํ๋์ ๋ถ๋ถ์ ๋ฃฉ๋ค์ด ๊ฐ์ฅ ๋ง์ด ํฌํจ๋๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฐ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ๋์ ํน์ ์ฒดํฌ ๋นํ ๊ธฐํ๊ฐ ์๋ค๋ ๊ฒ์ ์๋์ ๊ฐ์ด ์ฝ๊ฒ ์ฆ๋ช ํ ์ ์๋ค.
[ ์ฆ๋ช ]
๋ฃฉ์ ์ด $666$๊ฐ์ธ๋ฐ, ํน์ ์ ์ค์์ผ๋ก ๋์์ ๋ ์ ๋ง ์ด์ด ์ข์ง ์์ ๊ฒฝ์ฐ๋ 4๋ฐฉํฅ ๋ชจ๋ ๊ณ ๋ฅด๊ฒ ๋ฃฉ์ด ๋ถํฌ๋๋ ๊ฒ์ผ ๊ฒ์ด๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด ์ด๋ค ๋ฐฉํฅ์ผ๋ก ์กฐ์ด๋ ์ด ๋ฃฉ์ $\frac{3}{4}$๋ฐ์ ์กฐ์ด๋ ๋์์ด ๋์ง ์์ง๋ง, $666 \cdot \frac{3}{4} = 499.5$์ด๋ฏ๋ก ํน์ด ๋๊ฐ์ ๋๊น์ง ๊ฐ ๋์ 499๋ฒ์ ์์ง์์ ์๋ชจํ๋ค๋ ๊ฒ์ ๊ฐ์ํ๋ฉด ๋ฌด์กฐ๊ฑด ํน์ ์ฒดํฌ ๋นํ ๊ธฐํ๊ฐ ์๋ ๊ฒ์ด๋ค.
์ด๋ํ ๋๊ฐ์ ์ ๊ตฌํ๋ ๊ฒ์ ๋ํ ๊ตฌํ์ ์ฝ๊ฐ ํธ๋ฆญ์ ์ฌ์ฉํด์ ๊ตฌํํ๋๋ฐ ๋ด๋๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
const int MAXN = 1e3;
const int dy[4] = { 1, 1, -1, -1 }, dx[4] = { 1, -1, 1, -1 };
int ky, kx, cc[4], ry[MAXN], rx[MAXN], m[MAXN][MAXN];
void input() {
cin >> kx >> ky;
m[ky][kx] = -1;
FOR(i, 1, 667) cin >> rx[i] >> ry[i], m[ry[i]][rx[i]] = i;
}
bool moverock() {
int k, y, x; cin >> k >> x >> y;
if(k == -1 && y == -1 && x == -1) return true;
m[ry[k]][rx[k]] = 0;
m[y][x] = k;
ry[k] = y, rx[k] = x;
return false;
}
bool moveking(int y, int x) {
if(m[y][x] != 0) return false;
m[ky][kx] = 0;
m[y][x] = -1;
ky = y, kx = x;
cout << kx << ' ' << ky << ENDL;
return true;
}
int solve() {
// ์ผ๋จ king ์ค์์ผ๋ก ์ฎ๊ธฐ๊ธฐ
while(ky != 500 || kx != 500) {
int ny = ky == 500 ? ky : ky + (500-ky)/abs(500-ky), nx = kx == 500 ? kx : kx + (500-kx)/abs(500-kx);
if(!moveking(ny, nx)) assert(moveking(ky, nx));
if(moverock()) return 0;
}
// ๋ฐ๋๋ฐฉํฅ ๊ตฌํ๊ธฐ
FOR(i, 0, 1000) FOR(j, 0, 1000) if(m[i][j] > 0) ++cc[(i < 500 ? 0 : 2) + (j < 500 ? 0 : 1)];
int md = min_element(cc, cc+4) - cc;
// ๋๊ฐ์ ์ผ๋ก ์ด๋
while(1) {
int ny = ky + dy[md], nx = kx + dx[md];
if(!moveking(ny, nx)) assert(moveking(ky, nx));
if(moverock()) return 0;
}
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
execute();
return 0;
}
// ......................................... //
์ฒ์์๋ ์๋์ ๊ฐ์ด ์ค์๋ก $1,000$์ $100$์ผ๋ก ์ ๋ ๋ฐ๋์ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํด์ ์ฒซ ๋ฒ์งธ๋ก ๋ฉํ์ด ๊นจ์ก๊ณ ,
FOR(i, 501, 100)
...
๋ ๋ฒ์งธ ์ ์ถ ๋๋ dy, dx๋ฅผ ์๋ชป ์ ์ด์ ์๋ฑํ ๋๊ฐ์ ์ผ๋ก ์ด๋ํ๋ ๋ฐ๋์ WA๊ฐ ๋ฐ์ํด์ ๋ ๋ฒ์งธ๋ก ๋ฉํ์ด ๊นจ์ก๋ค.
const int dy[4] = { 1, -1, 1, -1 }, dx[4] = { 1, 1, -1, -1 };
๋คํํ ๋ผ์ด๋๊ฐ ๋๋๊ธฐ 12๋ถ ์ ์ ์ค์๋ฅผ ์ฐพ์ ๊ณ ์ณ์ AC๋ฅผ ๋ฐ์์ง๋ง, ๋ฑํ ํ ์คํธ ํ ๋ฐฉ๋ฒ์ด ์๋ ์ธํฐ๋ํฐ๋ธ ๋ฌธ์ ์์ AC๊ฐ ์ ๋จ๋ฉด ๋๋ฌด ๋ต๋ตํ ๊ฒ ๊ฐ๋ค.
B ์๋ชป ์ฝ์ด์ ์ฝ์งํ๊ณ , C ์๋ชป ์ฝ๊ณ ์ผ๊ฐํจ์์ ์ต์ํ์ง ์์ ์ฝ์งํ๋ ๋ฐ๋์ C๊น์ง ํ์์ ๋ ๋ฑ์๊ฐ $1200$๋ฑ์ด์ด์ ์๋นํ ๋ฉํ์ด ๊นจ์ก์๋ค.
D๋ฅผ ํ๋ฉด์ ๋ณด๋ C๊น์ง ํผ ์ฌ๋๋ค์ ๋ง์์ง๋ง, D, E, F๋ฅผ ํผ ์ฌ๋์ ๋ ์๋ฆฌ์ ๋จ์์๋ค.
๋ฐ๋ผ์ D๋ฅผ ํ๋ฉด $200$๋ฑ, ๋ชป ํ๋ฉด $1400$๋ฑ์ด๋ผ๋ ๋์ฐํ ๊ฐญ์ด ์๊ธฐ๋๋ฐ, ํํ์ด๋ฉด D๊ฐ ์ธํฐ๋ํฐ๋ธ ๋ฌธ์ ๊ณ ๋ฌธ์ ๋ ๋ญ๊ฐ ๋ณต์กํด๋ณด์ฌ์ ์ ๋งํ์๋ค.
ํ์ง๋ง ์ฐจ๊ทผ์ฐจ๊ทผ ์๊ฐํ๋ค๋ณด๋ ๊ฒฐ๊ตญ์ ํ์๊ณ ๋๊น์ง ํฌ๊ธฐํ์ง ๋ง๊ณ ํธ๋๊ฒ ์ค์ํ๋ค๋ ๊ฒ์ ๋ค์ ํ ๋ฒ ๋๊ผ๋ค.
์ฝ๋ํฌ์ค ๊ฒฐ๊ณผ
์ด๋ฒ ์ฝํฌ๋ ์์ํ๊ธฐ ์ ๋ถํฐ ์๋ฒ๊ฐ ๋ถ์๋ถ์ ํ๋๋๋ง ๊ฒฐ๊ตญ ์ฑ์ ํ์ ๋ค์ด๊ฐ ๋ฌธ์ ๊ฐ 40๋ถ ๊ฐ๊น์ด ์ฑ์ ๋์ง ์์ Unrated๊ฐ ๋ผ ๋ฒ๋ฆฌ๊ณ ๋ง์๋ค..;
๋ฌธ์ ์์ฒด๋ค์ ์ฌ์ด ํธ์ด์๊ณ , F๋ฒ ๋ํ ์ค๋ ์๊ฐํด๋ณด๋ฉด ํ๋ฆด ๊ฒ ๊ฐ์์ง๋ง, Unrated ๋ผ๋ ์์์ ๋์ ์ ์ ํด๋ดค๋ค.
A๋ฒ ๋ฌธ์ : ๊ตฌํ
์ธ์ ๋ ๊ทธ๋ ๋ฏ A, B๋ฒ ๋ฌธ์ ๋ ํ๋งํ๋ค.
๋จ์ํ ๊ตฌํ ๋ฌธ์ ๋ก, .
๊ณผ X
๋ก ์ด๋ฃจ์ด์ง ๋งต์ด ์ฃผ์ด์ง๋๋ฐ, ์ฌ๊ธฐ์ ๋ค์๊ณผ ๊ฐ์ ํํ๊ฐ ๋ช ๋ฒ์ด๋ ๋์ค๋์ง ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
X.X
.X.
X.X
ํํ๊ฒ ๋์ค๋ ๋งต์์์ ์ํ์ข์ฐ 4๋ฐฉํฅ ๋ฐฉ๋ฌธ๊ณผ ๊ฐ์ด dy, dx๋ฅผ ์ ์ํด๋๊ณ ๊ตฌํ์ ํ๋ฉด ํธํ๋ค.
๋จ, ์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ์๋ ๋ชจ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ dy = { -1, -1, 1, 1 }
, dx = { -1, 1, -1, 1 }
๋ก ์ ์ํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๊ณ ๋ ํ X๊ฐ ๋ฑ์ฅํ๋ ๊ณณ๋ง๋ค 4๋ฐฉํฅ ๋ชจ๋๊ฐ X์ด๋ฉด ์นด์ดํธ๋ฅผ ํด๊ฐ๋ฉด ๋๋ค.
์๊ฐ๋ณต์ก๋: $O(n^2)$
include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
const int MAXN = 500;
const int dy[4] = { -1, -1, 1, 1 }, dx[4] = { -1, 1, -1, 1 };
int n;
string g[MAXN];
void input() {
cin >> n;
FOR(i, 0, n) cin >> g[i];
}
int solve() {
int cc = 0;
FOR(i, 0, n) {
FOR(j, 0, n) {
if(g[i][j] == 'X') {
bool ok = true;
FOR(dir, 0, 4) {
int y = i + dy[dir], x = j + dx[dir];
if(!(0 <= y && y < n && 0 <= x && x < n && g[y][x] == 'X')) { ok = false; break; }
}
if(ok) ++cc;
}
}
}
cout << cc << ENDL;
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
B๋ฒ ๋ฌธ์ : ๊ตฌํ
map
๋ฌธ์ ๊ฐ ์ฅํฉํ๊ฒ ๊ธธ์ด ํด์ํ๋๊ฒ ๋ฌธ์ ์ธ ๋ฌธ์ ์ด๋ค.
๊ฒ๋ค๊ฐ ์์ธํ๊ฒ ์ฝ์ง ์์ผ๋ฉด ์ง๋์น ์ ์๋ ๋ฌธ์ฅ๋ ์์ผ๋ ์ฃผ์ํด์ผ ํ๋ค.
๋ ์คํ ๋์ด ์๋๋ฐ, ๊ฑฐ๊ธฐ์๋ $n$์ข ๋ฅ์ ์์์ด ์๊ณ $m$๋ช ์ ์๋์ด ์์์ ๋จน์ผ๋ ค๊ณ ์ผ๋ ฌ๋ก ๋๊ธฐ์ค์ด๋ค.
์์์ ๊ฐ๊ฐ $a_{1..n}$๊ฐ ๋งํผ ์๊ณ , $c_{1..n}$์์ ๊ฐ๊ฒฉ์ ํ๋งคํ๊ณ ์๋ค.
์๋๋ค์ ์จ ์์๋๋ก ์ฐจ๋ก๋ก ์์์ ๋จน๋๋ฐ, ๋ค์ ๊ณผ์ ์ ๋ฐ๋ผ ์์์ ๊ฐ์ ธ๊ฐ๊ฒ ๋๋ค.
ํ์ฌ ์๋ $i$๋ ์ฒ์์ผ๋ก ๋จน์ ์์ $t_i$์ ๋จน์ ์์๋ค์ ๊ฐ์ $d_i$ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ด ์๋์ด ํ์ฌ ๋จน์ ์์์ด $j$๋ผ๊ณ ํ ๋ ๋ค์์ ๊ณผ์ ์ ๋ฐ๋ผ ์ด $d_i$๊ฐ์ ์์์ ๋จน์ผ๋ ค๊ณ ํ๋ค.
- ์์ $j$๊ฐ ๋จ์์๋ ๊ฒฝ์ฐ ํด๋น ์์์ ๋จน๋๋ค.
- ์์ $j$๊ฐ ๋จ์์์ง ์์ ๊ฒฝ์ฐ, ๋จ์์๋ ์์๋ค ์ค ๊ฐ์ฅ ์ผ ์์์ ๊ณ ๋ฅด๊ณ , ๊ฐ๊ฒฉ์ด ๊ฐ์ ๊ฒ์ด ์์ ๊ฒฝ์ฐ index๊ฐ ๊ฐ์ฅ ์์ ๊ฒ์ ๊ณ ๋ฅธ๋ค.
- ์๋์ด $d_i$๊ฐ์ ์์์ ๋ค ๋จน์ง ๋ชปํ๋๋ฐ ๋ชจ๋ ์์์ด ๋ค ๋จ์ด์ก์ ๊ฒฝ์ฐ, ์๋์ ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ํด๋น ์๋์๊ฒ์๋ ๋์ ์์ ๋ฐ์ ์ ์๋ค (0์)
์ ๊ณผ์ ์ ๋ฐ๋ณตํ ๋ ๊ฐ ์๋์๊ฒ์ ์ผ๋ง์ ๋์ ๋ฐ์ ์ ์์์ง ๊ณ์ฐํ๋ ๋ฌธ์ ์ด๋ค.
๊ณ ๋ คํด์ผ ํ ๊ฒ์ด ์กฐ๊ธ ์๋ ๊ตฌํ๋ฌธ์ ์ด๋ค.
์์ $j$๋ฅผ ๋ค ๋จน์ ๋ค 2๋ฒ ์กฐ๊ฑด
์ ๋ง๋ ๋ค์ ์์์ ๋น ๋ฅด๊ฒ ๊ตฌํ๋ ๊ฒ์ด ๋ฌธ์ ์ธ๋ฐ, ์ด๊ฒ์ map<ii, int>
๋ฅผ ์ฌ์ฉํ๋ฉด key๊ฐ์ ๋ฐ๋ผ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๊ฐ ์ ์ง๋๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
์ฌ๊ธฐ์ map
์๋ mp[{cost, index}] = remain
๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ฉด ๋๋ค.
๋ ํ๊ฐ์ง ์ฃผ์ํด์ผ ํ ์ ์ 3๋ฒ ์กฐ๊ฑด
์์ ํด๋น ์๋์ด ์์์ ๋จน๊ธฐ๋ ๋จน์์ง๋ง ์ํ๋ ๋งํผ ๋ชป ๋จน์ด ๋์ ๋ชป ๋ฐ๋ ๊ฒฝ์ฐ์ ๋ํ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ค๋ ๊ฒ์ด๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
const int MAXN = 1e5;
int n, q, r[MAXN], c[MAXN];
map<ii, int> mp;
void input() {
cin >> n >> q;
FOR(i, 0, n) cin >> r[i];
FOR(i, 0, n) cin >> c[i], mp[{c[i], i}] = r[i];
}
int useitem(int idx, int val) {
int us = min(val, r[idx]);
r[idx] -= us;
if(r[idx] == 0) mp.erase({ c[idx], idx });
else mp[{c[idx], idx}] -= us;
return us;
}
int solve() {
while(q--) {
int cur, rem;
cin >> cur >> rem;
--cur;
i64 tot = 0;
while(rem) {
int us = useitem(cur, rem);
rem = rem - us;
tot += 1ll * us * c[cur];
if(mp.size()) {
cur = mp.begin()->first.second;
} else if(rem != 0) {
tot = 0;
break;
}
}
cout << tot << ENDL;
}
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
C๋ฒ ๋ฌธ์ : ๊ทธ๋ฆฌ๋
math
์ง์ ๊ฐ์ ์์๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋๋ฐ, ์ด ๋ฐฐ์ด์์ ์์๋ค์ 2๊ฐ ์ด์์ ์์๋ฅผ ๊ฐ์ง ๊ทธ๋ฃน๋ค๋ก ๊ทธ๋ฃจํํด์ ๊ฐ ๊ทธ๋ฃน ์์์ ํฉ์ ์ ๊ณฑ์ ํฉ
์ด ๊ฐ์ฅ ์์์ง๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์ฆ, $m$๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๊ทธ๋ฃจํ์ ํ๋ค๊ณ ๊ฐ์ ํ๊ณ , ๊ทธ๋ฃน $j$์ ์์ ํฉ์ $s_j$๋ผ๊ณ ํ ๋ ๋ค์์ ์ต์ํ ํ๋ฉด ๋๋ค.
์ฐ์ ๋ค์์ ์๊ฐํด๋ณด์.
$a$, $b$, $c$ ์ธ ๊ฐ์ ์์ ์ ์๊ฐ ์๋๋ฐ $a^2 + b^2 + c^2$์ด ๋ ์์๊น ์๋๋ฉด $(a+b)^2 + c^2$์ด ๋ ์์๊น?
๋น์ฐํ๊ฒ๋ ์์ ์ ๊ฐํด๋ณด๋ฉด ์ ์๊ฐ ์์ ์ ๋ฐ์ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๊ฒ์ ํตํด ์ฐ๋ฆฌ๋ ์ต๋ํ ๊ทธ๋ฃน์ ํฌ๊ธฐ๋ฅผ ์๊ฒ ํด์ ๊ทธ๋ฃจํ ํ๋๊ฒ ๋ฌด์กฐ๊ฑด ์ด๋์ด๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
์ด ๋ฌธ์ ์์๋ ๊ฐ ๊ทธ๋ฃน์ ์์์ ์๊ฐ ์ต์ 2๊ฐ๋ ๋์ด์ผ ํ๊ณ , ๋ฐฐ์ด์ ์์๋ ์ง์๊ฐ์ด๋๊น ๋ฌด์กฐ๊ฑด 2๊ฐ์ฉ ๊ทธ๋ฃจํ์ ํ๋ฉด ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ค ์๋ผ๋ฆฌ ์ง์ ์ง์ด์ค์ผ ํ ๊น?
$(a + b)^2 = a^2 + b^2 + 2ab$ ์ด๋ฏ๋ก, $a^2 + b^2$๋ถ๋ถ์ ์ด๋ป๊ฒ ์ง์ ์ง๋ ๊ฒฐ๊ตญ ์ต์ข ํฉ์ ๋๊ฐ์ ๊ฐ์ด ๋์ฌ ๊ฒ์ด๊ณ ๋ฌธ์ ๋ $ab$์ ๊ฐ์ ์ต์ํ ํ๋ ๊ฒ์ด๋ค.
๊ฐ๋จํ๊ฒ ์๊ฐํด๋ณด๋ฉด ๋ฐฐ์ด์์ ๋จ์ ์๋ค ์ค ๊ฐ์ฅ ์์ ์์ ๊ฐ์ฅ ํฐ ์๋ฅผ ๋งค์นญํด๋๊ฐ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ฉด ๊ทธ๊ฒ์ด ์ต์๊ฐ์ด๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
์ ํํ ์ฆ๋ช ์ $a < b < c < d$ ๋ค ์๊ฐ ์๋๋ฐ $a \cdot d + b \cdot c > a \cdot b + c \cdot d$ ํน์ $a \cdot d + b \cdot c > a \cdot c + b \cdot d$ ์ธ ๊ฒฝ์ฐ๊ฐ ์์๊น์ ๋ํด ์๊ฐํด๋ณด๋ฉด ๋๋ค.
์๊ฐ ์์ด multiset
์ ์จ๋ฒ๋ ธ๋๋ฐ, ์ฌ์ค ๊ทธ๋ฅ sort
ํด์ ํธ๋๊ฒ ํธํ๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
const int MAXN = 3e5;
int n, ar[MAXN];
multiset<int> ms;
void input() {
cin >> n;
FOR(i, 0, n) cin >> ar[i];
}
int solve() {
FOR(i, 0, n) ms.insert(ar[i]);
i64 ans = 0;
FOR(i, 0, n/2) {
int ss = (*ms.begin()) + (*(--ms.end()));
debug(ss);
ms.erase(ms.begin());
ms.erase(--ms.end());
ans += 1ll * ss * ss;
}
cout << ans << ENDL;
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
D๋ฒ ๋ฌธ์ : ๊ทธ๋ํ
MST
์ ์ ์ด $10^5$๊ฐ ์ ๋ ๋๋ ์ฐ๊ฒฐ ๋ฌดํฅ ๊ทธ๋ํ
๊ฐ ์ฃผ์ด์ง๊ณ , ๊ฐ ์ ์ ์ $1..n$์ index๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ด ๋, 1๋ฒ ์ ์
์์ ์ถ๋ฐํ์ฌ ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ๋ค์ ๋ฐฉ๋ฌธํ ๋, ์๋ก ๋ฐฉ๋ฌธํ ์ ์ ๋ค์ ์์ด์ด ์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ์์๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์ฆ, ๋ฐฉ๋ฌธํ๋ ์ ์ ์ ๋ ๋ฐฉ๋ฌธํ ์ ์๊ณ , ์๋ก์ด ์ ์ ์ ๋ง๋ ๋๋ง ์์ด์ ๊ธฐ๋กํ ๋ ์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ์์ ์์ด์ ์ฐพ๋ ๊ฒ์ด๋ค.
Prim MST
๋ฌธ์ ๋ผ๋ ๊ฒ์ ๋นจ๋ฆฌ ์์์ฐจ๋ฆฌ๋๊ฒ ์ค์ํ๋ฐ, ๋ฐฉ๋ฌธ์ ํํ๊ฐ โ์ง๊ธ๊น์ง ๋ฐฉ๋ฌธํ ์ ์ ๋ค (์ฐ๊ฒฐ๋ ํธ๋ฆฌ)โ์ ์ฐ๊ฒฐ๋ ์ ์ ๋ค ์ค index๊ฐ ๊ฐ์ฅ ์์ ๊ฒ์ ์ฐพ์ ํด๋น ์ ์ ์ ํธ๋ฆฌ์ ๋ฃ๋ ์์ด๋ผ๋ ๊ฒ์ ๋ณด๋ฉด MST ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์ฝ๊ฒ ์ ์ ์๋ค.
prim๊ณผ ๋น์ทํ ํํ๋ก ๊ตฌํํ๋ฉด ๋๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
const int MAXN = 1e5+10;
int n, m, vis[MAXN];
vi g[MAXN];
set<int> rem;
void input() {
cin >> n >> m;
while(m--) {
int u, v; cin >> u >> v;
g[u].pb(v), g[v].pb(u);
}
}
int solve() {
rem.insert(1);
while(rem.size()) {
int u = *rem.begin();
rem.erase(u);
vis[u] = 1;
cout << u << ' ';
for(int v : g[u]) {
if(!vis[v]) rem.insert(v);
}
}
cout << ENDL;
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
์ฒ์์๋ ๋ณ ์๊ฐ ์์ด ์ผ๋ฐ์ ์ผ๋ก dfsํ๋ฉฐ ํ์ฌ ์ ์ ์ ์ฐ๊ฒฐ๋ ์๋ก์ด ์ ์ ์ค index๊ฐ ๊ฐ์ฅ ์์ ๊ฒ์ผ๋ก ๊ฐ๋ณด๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋๋ฐ, ๋์ค์ ๋ณด๋ 3-1-2-4
์ ๊ฒฝ์ฐ ์์ธ๊ฐ ์๋ค๋๊ฑธ ์์๋ค.
์ฌ์ค ์ ์ถ ํ ๋๋ถํฐ ๋ญ๊ฐ ์์ธ๊ฐ ์์ ๊ฒ ๊ฐ์ ๋ถ์๊ฐ์ด ์์์ง๋ง ๋ฌด์ํ๊ณ ์ ์ถํ์๋๋ฐ, ์ด ๋๋ถ์ ํ๋ฆฐ ํจ๋ํฐ + ์ฑ์ ๋ ๋๊น์ง์ ์๊ฐ 40๋ถ ํจ๋ํฐ๋ฅผ ๋ฐ์๋ฒ๋ ค ๋ฑ์๊ฐ ๋ง์ด ๋ด๋ ค๊ฐ๋ค..
ํ๋ฆฐ๊ฑธ ์๊ณ AC๋ฅผ ๋ฐ์ ๋๊น์ง ์๊ฐ์ ๋ณ๋ก ์ ๊ฑธ๋ ธ์ง๋ง ์ฌ๋ฌ๋ชจ๋ก ์์ฌ์ด ๋ฌธ์ ์๋ค.
E๋ฒ ๋ฌธ์ : DP
multiset
$[1..n]$์ ๊ฐ ์ขํ๊ฐ ์ ์ํ ๋ ์๊ฐ ์์์ ์ฃผ์ด์ง ๋ฃจํด์ ๋ฐ๋ผ $k$๊ฐ์ ๋์ ์ ์ฃผ์๊ฐ๋๋ฐ, ์ต๋ $m$๋ฒ์ ๋ฐฉํด๋ฅผ ํ ์ ์์ ๋ ์ต์ ์ผ๋ก ๋ฐฉํดํ ๊ฒฝ์ฐ ์ป์ ์ ์๋ ์ต์ ๋์ ๊ฐ์น๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
๊ฐ ๋์ $i$๋ ์ฃผ์ธ ์ ์๋ ์๊ฐ์ ๊ตฌ๊ฐ $[s_i..e_i]$์ด ์กด์ฌํ๊ณ , ์ด ๋์ ์ ์ฃผ์ธ ๊ฒฝ์ฐ $d_i$๊น์ง๋ ์๋ฌด๋ฐ ํ๋๋ ํ์ง ๋ชปํ๋ฉฐ, $c_i$์ ๊ฐ์น๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋์ ์ ์ฃผ์ธ ๋๋ ํ์ฌ ์ฃผ์ธ ์ ์๋ ๋์ ์ค ๋ค์๊ณผ ๊ฐ์ ์ฐ์ ์์์ ๋ฐ๋ผ ์ค๊ฒ ๋๋ค.
- ๋์ ์ ๊ฐ์น c_i๊ฐ ํฐ ์์ผ๋ก ์ค๋๋ค.
- c_i๊ฐ ๊ฐ์ ๊ฒฝ์ฐ d_i๊ฐ ํฐ ์์ผ๋ก ์ค๋๋ค.
- ๋๋จธ์ง ๊ฒฝ์ฐ๋ ๋๋ํ๊ฒ ์ค๋๋ค.
์ด ๋ ๋ฐฉํด
๋ผ๋ ๊ฐ๋
์ ํ์ฌ ์๊ฐ $t$์ ๋ฐฉํด๋ฅผ ํ ๊ฒฝ์ฐ $t$์๋ ์๋ฌด๋ฐ ํ๋๋ ํ์ง ๋ชปํ๋ฉฐ $[t+1..]$์์๋ถํฐ ํ๋์ ํ ์ ์๋ค.
๋ํ $e_i \leq d_i$๋ผ๋ ์กฐ๊ฑด์ด ํญ์ ์ฑ๋ฆฝํ๋ค.
๋จผ์ ์ธ์งํด์ผ ํ ์ ์, ์๊ฐ์ ๋ฒ์๊ฐ $[1..10^5]$์ด๊ณ , ๋ฐฉํด ํ์๋ $[1..200]$์ผ๋ก ์๋นํ ์๋ค๋ ๊ฒ์ด๋ค.
์ด๊ฒ๋ง ๋ด์๋ DP
์ ๋์๊ฐ ๋๋๋ฐ, ์ข ๋ ์๊ฐํด๋ด์ผ ํ๋ค.
๋ง์ฝ DP
๋ก ํด๊ฒฐํ ๊ฒฝ์ฐ ์ํ๊ณต๊ฐ
์ ์ด๋ป๊ฒ ๋๋๊ฑธ๊น?
ํ์ฌ ์๊ฐ $t$์ ํ์ฌ๊น์ง ๋ฐฉํดํ ํ์ $m$์ ๋ํ ์ ๋ณด๋ ๋น์ฐํ ํ์ํ ๊ฒ์ด๋ค.
ํ์ง๋ง, ์ด์ ์๊ฐ์ ๋ฐฉํด๋ฅผ ์ด๋ป๊ฒ ํ๋๋์ ๋ฐ๋ผ์ ํ์ฌ ์ฃผ์ธ ์ ์๋ ๋์ ๋ค์ด ๋ฌ๋ผ์งํ ๋ฐ ์ด ์ ๋ณด๋ฅผ ๋ชจ๋ ์ํ๊ณต๊ฐ์ ๋ฃ์ด๋ฒ๋ฆฌ๋ฉด $2^{200}$์ด ๋์ด๋ฒ๋ฆฌ๋๋ฐ ๊ณผ์ฐ ์ด ์ ๋ณด๊ฐ ํ์ํ ๊น?
์กฐ๊ธ๋ง ์๊ฐํด๋ณด๋ฉด ์๋๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
๊ฐ ์๊ฐ $t$์์ ์ฃผ์ธ ์ ์๋ ๋์ ๋ค์ ํ์ฌ ๋ฐฉํด ํ์ $m$์ด๋ ์ด์ ๋ฐฉํด ์ ๋ณด์ ์ํฅ์ ๋ฐ์ง ์๋๋ค!
$s_i \leq t \leq e_i$์ธ ๋์ ๋ค์ ๋ฌด์กฐ๊ฑด $t$ ์๊ฐ์ ์ฃผ์ธ ์ ์๋ค.
์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋, ๋ง์ฝ ๋์ $i$๋ฅผ ์ค๋ ํ๋์ ํ ๊ฒฝ์ฐ ๋ค์ ํ๋ ํ ์ ์๋ ์๊ฐ์ $d_i+1$๋ถํฐ์ผ ๊ฒ์ด๋ฉฐ, $e_i \leq d_i$๋ผ๋ ์กฐ๊ฑด ๋๋ถ์ $e_j$๊ฐ $d_i$๋ณด๋ค ์์ ๋์ ๋ค $j$๋ ์ด์ฐจํผ $[d_i+1..]$๋ถํฐ๋ ์ค์ง ๋ชปํ ๊ฒ์ด๋ค.
๋ํ ์ฃผ์ธ ์ ์๋ ๋์ ์ด ์๋๋ฐ ์ค์ง ์๋ ๊ฒฝ์ฐ๋ ๋ฐฉํด๋ฅผ ๋ฐ์์ ๋ ๋ฟ์ธ๋ฐ, ๊ทธ ๊ฒฝ์ฐ๋ ๋จ์ํ $t$๊ฐ $t+1$์ด ๋ ๋ฟ์ด๋ฏ๋ก ์ฃผ์ธ ์ ์๋ ๋์ ์ ๋ํ ์ ๋ณด๋ ๋ณํ์ง ์๋๋ค.
์ด๊ฒ์ ์ด์ฉํด DP์
์ ์ธ์ฐ๋ฉด ํ์ฌ ์๊ฐ์ $t$, ํ์ฌ ์ฌ์ฉํ ๋ฐฉํด ํ์๋ฅผ $m$์ด๋ผ ํ ๋
ํ์ฌ ์ฃผ์ธ ์ ์๋ ๋์ ์ด ์์ ๋
๋ฐฉํด๋ฅผ ํ ๋
๋ฐฉํดํ์ง ์๊ณ ๋์ ์ ์ฃผ์ธ ๋ ($i$ = ํ์ฌ ์ฃผ์ธ ๋์ )
ํ์ฌ $t$์์ ์ฃผ์ธ ์ ์๋ ๋์ ์ multiset
์ ํตํด ๊ตฌํํ๋ฉด ํธํ๋ค.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL_BOOKNU
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ........................macro.......................... //
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
#define RFOR(i, f, n) for(int (i) = (f); (i) >= (int)(n); --(i))
#define pb push_back
#define emb emplace_back
#define fi first
#define se second
#define ENDL '\n'
#define sz(A) (int)(A).size()
#define ALL(A) A.begin(), A.end()
#define UNIQUE(c) (c).resize(unique(ALL(c)) - (c).begin())
#define next next9876
#define prev prev1234
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef long long i64;
typedef unsigned long long ui64;
// inline i64 GCD(i64 a, i64 b) { if(b == 0) return a; return GCD(b, a % b); }
inline int getidx(const vi& ar, int x) { return lower_bound(ALL(ar), x) - ar.begin(); } // ์ขํ ์์ถ์ ์ฌ์ฉ: ์ ๋ ฌ๋ ar์์ x์ idx๋ฅผ ์ฐพ์
inline i64 GCD(i64 a, i64 b) { i64 n; if(a < b) swap(a, b); while(b != 0) { n = a % b; a = b; b = n; } return a; }
inline i64 LCM(i64 a, i64 b) { if(a == 0 || b == 0) return GCD(a, b); return a / GCD(a, b) * b; }
inline i64 CEIL(i64 n, i64 d) { return n / d + (i64)(n % d != 0); } // ์์์ผ ๋ ์ด์ํ๊ฒ ์๋ํ ์ ์์.
inline i64 ROUND(i64 n, i64 d) { return n / d + (i64)((n % d) * 2 >= d); }
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a, n /= 2) { if(n%2) ret *= a; }
return ret;
}
template <class T>
ostream& operator<<(ostream& os, vector<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> v) {
os << "[";
int cnt = 0;
for(auto vv : v) { os << vv; if(++cnt < v.size()) os << ","; }
return os << "]";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> p) { return os << "(" << p.fi << "," << p.se << ")"; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << H, debug_out(T...); }
// ....................................................... //
const i64 INF = 0x3fffffffffffffff;
const int MAXN = 1e5+10, MAXM = 2e2+10;
int n, m, k;
i64 dp[MAXN][MAXM]; // dp[์๊ฐ][๋ฐฉํด์]
vii str[MAXN], fin[MAXN]; // edg[s] = e, cost, d;
multiset<ii> ms;
void input() {
cin >> n >> m >> k;
FOR(i, 0, k) {
int s, e, d, c; cin >> s >> e >> d >> c; ++d;
str[s].pb({ -c, -d });
fin[e+1].pb({ -c, -d });
}
}
int solve() {
FOR(i, 0, MAXN) FOR(j, 0, m+1) dp[i][j] = INF;
dp[0][0] = 0;
FOR(t, 0, n+1) {
for(ii e : str[t]) ms.insert(e);
for(ii e : fin[t]) ms.erase(ms.find(e));
FOR(us, 0, m+1) {
if(ms.size()) {
// ๋ฐฉํด ์์ด ๊ฐ๋ณด๊ธฐ
ii sel = *ms.begin();
dp[-sel.se][us] = min(dp[-sel.se][us], dp[t][us] + ((i64)-sel.fi));
// ๋ฐฉํด ํ๊ณ ๊ฐ๋ณด๊ธฐ
if(us < m) dp[t+1][us+1] = min(dp[t+1][us+1], dp[t][us]);
} else dp[t+1][us] = min(dp[t+1][us], dp[t][us]);// ์์ ๋จน์๊ฒ ์์ด ๋ฐฉํด ์๊ฐx
}
}
i64 ans = INF;
FOR(i, 0, m+1) {
ans = min(ans, dp[n+1][i]);
}
cout << ans << ENDL;
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifdef LOCAL_BOOKNU
freopen("input.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0), ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
๋ถ๋ช
DP์
๋ ์ ์ธ์ ๊ณ , ๋ฒ์์ ๋ํ ์ค์๋ ์์๋๋ฐ WA
๊ฐ ๋จ๊ธธ๋ ์๋นํ ๋นํฉ์ค๋ฌ์ ๋ค.
์๋ฌด๋ฆฌ ๋ด๋ ๋ง์ํ์ด์ด์ ํน์๋ multiset
์ erase
์ ๋ฌธ์ ๊ฐ ์๋ ์ฐพ์๋ดค๋๋ erase(x);
๊ฐ ์์ ํ๋๋ง์ ์ง์ฐ๋ ๊ฒ์ด ์๋ ํด๋น๋๋ ๋ชจ๋ ์์๋ฅผ ์ง์ฐ๋ ๊ฒ์ด์๋ค.
erase(multi_set.find(x));
๋ก ๋ฐ๊พธ์๋๋ AC
๊ฐ ๋จ๊ธด ๋ด๋๋ฐ ์์ผ๋ก multiset
์ ์ธ ๋๋ ์กฐ์ฌํด์ผ ํ ๊ฒ ๊ฐ๋ค.
๋์ ๊ฐ์ ์ค์๋ฅผ ํ ์ฌ๋๋ค์ด ๊ฝค ์์๋ค.
D์์ ํ ๋ฒ ์ฝ์ง์ผ๋ก 40๋ถ ํจ๋ํฐ ๋ฐ์๊ฒ ๋๋ฌด ์ต์ธํ๋ค.
E๋ฒ์ด์ผ ๋ด๊ฐ multiset
์ ๋ํด์ ์ ๋ชฐ๋ผ์ ์๊ฐ์ ๋ง์ด ๋ญ๋นํ์ง๋ง, D๋ฒ์ ์์ํ ์ฑ์ ํ๊ฐ ์ ๋๋ก ๋์๊ฐ์ง ์์์ ์๊ฐ์ ๋ ๋ฆฐ ๊ฒ์ด๋โฆ
ํ์ง๋ง ๋ฌด์๋ณด๋ค ์ต์ธํ ๊ฒ์ ์ด๋ฒ์๋ ๊ฝค๋ ๋ฌธ์ ๋ฅผ ์ ํ์๋๋ฐ Unrated๊ฐ ๋ ๊ฒ์ด๋ค.
์ฝํฌ ๊ฒฐ๊ณผ
์ฐ์ํ ํ์ ๋ค ๊ธฐ์ ๋ธ๋ก๊ทธ, Huns.me ๋ฑ์ ์ฐธ์กฐํ์ฌ ์์ฑ๋ ๊ธ์ ๋๋ค.
๋ํ Git
๊ณผ GitFlow
์ ๋ํด ์์๊ฐ๋ ์์ค์ ์ด ๊ธ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค.
GitHub
๋ ์คํ์์ค์ ์ฌ๋ฌ๊ฐ์ง ํ๋ก์ ํธ๋ฅผ ์ํ ํ์
, ์ฝ๋ ๊ด๋ฆฌ๋ฅผ ๋์์ฃผ๋ ํธ๋ฆฌํ ํ๋ซํผ์ด๋ค.
ํ์ฌ ๊ณต๋์ผ๋ก ์งํํ๋ ํ๋ก์ ํธ๋ ์์ง๋ง, ์์ ์ GitHub
๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋ ๋ฉํ๊ณผ PC์์ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์์ ํ๋ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ๊ฐ ํ๋ค์๋ ๊ธฐ์ต์ด ์๋ค.
ํ์ง๋ง GitHub
๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ๋ฉด์ push
์ pull
๋ง ์ ๋๋ก ํด์ฃผ๋ฉด ์ด๋ฐ ๋ฌธ์ ์ ๋ค์ด ์์ด์ก๋ค.
๋ํ ์งํํ๋ค๊ฐ ๋ฒ๋ฆฐ ํ๋ก์ ํธ๋ ์ค๋ซ๋์ ์ฐ์ง ์๋ ํ๋ก์ ํธ๋ฅผ ์ฐพ์ ๋๋ GitHub
๋ก ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๋ค๋ฉด ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค๋ ๊ฒ์ด ๋ง์์ ๋ค์๋ค.
GitFlow
๋ Git
์์ ์ํํธ์จ์ด์ ์์ค์ฝ๋์ ๋ฒ์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ธ๋์นญ ๊ด๋ฆฌ ์ ๋ต์ด๋ค.
์ด๊ฒ์ ๊ฝค๋ ์ค๋๋ ์ ๋ต์ด๋ฉฐ, ํ์ฌ๊น์ง ๋ฐ๊ฒฌ๋ ๋จ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด Github Flow์ Gitlab Flow ์ ๋ต์ด ๋์๋ค.
๊ฒฐ๊ตญ์ ์ด๋ฆ์ ๊ฑฐ์ฐฝํ์ง๋ง, Git
์์ ์ ๊ณตํ๋ ๋ธ๋์นญ ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ง์ ๋ํ ์ง์นจ๋๋ผ๊ณ ๋ณผ ์ ์๋ค.
GitFlow
์๋ ์๋ 5๊ฐ์ง์ ๋ธ๋์น๊ฐ ์กด์ฌํ๋ค.
์ด ๋ธ๋์น๋ค์ ํฌ๊ฒ 2๊ฐ๋ก ๋๋๋๋ฐ, ํญ์ ์ ์ง๋๋ ๋ฉ์ธ ๋ธ๋์น(master
, develop
)์ ์ผ์ ๊ธฐ๊ฐ์๋ง ์ ์ง๋๋ ๋ณด์กฐ ๋ธ๋์น(feature
, release
, hotfix
)๊ฐ ์๋ค.
์ด ๊ทธ๋ฆผ์ ์์์๋ถํฐ ์ฒ์ฒํ ์ดํด๋ณด๋ฉด, ์ผ๋จ ์ฒ์์๋ master
์ develop
๋ธ๋์น๊ฐ ์กด์ฌํ๋ค.
develop
์๋ hotfix
์์ ์์๋ก ๋ฒ๊ทธ๋ฅผ ํฝ์คํ ์ปค๋ฐ์ด ์ถ๊ฐ๋๋ค.
feature
์์๋ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ ๊ฒฝ์ฐ develop
์์ ๋ธ๋์น๋ฅผ ์์ฑํ๋ค.
๋ฐ๋ผ์ feature
์ ์ธ์ ๋ develop
์์ ์์ํ๊ฒ ๋๋ค.
feature
์์ ๊ฐ๋ฐ๋๋ ๊ธฐ๋ฅ์ด ์์ฑ๋์๋ค๋ฉด develop
์ผ๋ก ๋ค์ merge ๋๊ฒ ๋๋ค.
develop
์ ์ด๋ฒ ๋ฒ์ ์ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ด merge ๋์๋ค๋ฉด ์ค๋ฅ๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํด release
๋ฅผ ์์ฑํ๊ณ ๊ฒ์ฆ์ด ์๋ฃ๋์๋ค๋ฉด ์ ์ ๋ฒ์ ์ผ๋ก ์ถ์ํ๊ธฐ ์ํด develop
๊ณผ master
์ merge๋ฅผ ํ๋ค.
์ฆ, master
์ ์ค์ ์ถ์๋ ๋ฒ์ ์ด๊ณ , develop
์์๋ ๋ค์ ๋ฒ์ ์ ์ํ ๊ฐ๋ฐ์ด ์งํ๋๊ณ , ๊ทธ๊ฒ์ ํ์ํ ๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ feature
์์ ๊ฐ๋ฐ๋๋ฉฐ, hotfix
๋ ์ด๋ฏธ ์ถ์๋ ๋ฒ์ ์์ ๋ฐ์ํ ๋ฒ๊ทธ๋ฅผ ํฝ์คํ์ฌ ํ์ฌ ๊ฐ๋ฐ์ค์ธ develop
๊ณผ ํ์ฌ ์ถ์๋ master
์ ์ ์ถํ๋ ์ญํ ์ด๊ณ , release
๋ ๋ค์ ๋ฒ์ ์ ๋ํ ๊ธฐ๋ฅ์ด ๋ชจ๋ ์ถ๊ฐ๋์์ ๋ ์ค์ ๋ก ์ถ์ํ๊ธฐ ์ QA๋ฅผ ์ํ ๋ธ๋์น์ธ ๊ฒ์ด๋ค.
GitFlow
์ค์น๋ฒ์ ์ด ๋งํฌ์ ๋์์๋ค.
Window์ ๊ฒฝ์ฐ Git Bash๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฐ์ ํ์ ์๋ ๋ช
๋ น์ด๋ฅผ ํตํด gitflow
๋ฅผ cloneํด์ค๋ฉด ๋๋ค.
git clone โrecursive git://github.com/nvie/gitflow.git
GitFlow
๋ฅผ ์ ์ฉํ repo์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ์์์ ๋งํ 5๊ฐ์ ๋ธ๋์น์ ๊ฑฐ๊ธฐ์ ์ถ๊ฐ์ ์ผ๋ก support
๋ผ๋ ๋ธ๋์น๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ, ์ด๊ฒ์ ๋ฒ์ ํธํ์ฑ ๋ฌธ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ธ๋์น์ด๋ค.
git flow init
๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ๋ฉ์ธ ๋ธ๋์น์ ์ด๋ฆ์ ์ ๋ ฅํ๋ผ๋ ๋ฉ์ธ์ง์ ๋ณด์กฐ ๋ธ๋์น๋ค์ ์ด๋ฆ์ ์ ๋ ฅํ๋ผ๋ ๋ฉ์ธ์ง๊ฐ ๋์ค๋๋ฐ ์๋ฌด๊ฒ๋ ์ ๋ ฅํ์ง ์๊ณ ์ํฐ๋ฅผ ๋๋ฅด๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ํด์ง๋ค.
๋ง์ฝ ๋ชจ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๊ณ ์ถ๋ค๋ฉด -d ์ต์ ์ ๋ถ์ด๋ฉด ๋๋ค.
git flow init -d
์ด๊ธฐํ๋ฅผ ์๋ฃํ๋ฉด master
์ธ์ develop
๊ฐ ์๊ธด๋ค.
feature
๋ธ๋์น ์ฌ์ฉํ๊ธฐ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋ ๋ธ๋์น๋ master
, develop
๋ ๊ฐ ๋ฟ์ด๊ณ ์๋ก์ด ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์ํด feature
์ด ํ์ํ๋ฉด ๋ค์ ๋ช
๋ น์ด๋ฅผ ํตํด ๋ง๋ค์ด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด feature
๋ธ๋์น๋ ์์์ ์ค๋ช
ํ๋ฏ์ด ํญ์ ํ์ฌ develop
์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋๋ค.
git flow feature start <โbranch nameโ>
์ด feature
์์ ์๋ก์ด ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์๋ฃํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์ด๊ฒ์ GitFlow
์ ์๋ ค์ฃผ๋ฉด GitFlow
๋ ๋ค์๊ณผ ๊ฐ์ ํ๋์ ํ๋ค.
develop
๋ก checkout ํ ํ,feature
์ develop
๋ก mergeํ๊ณ ,feature
์ ์ญ์ ํ๋ค.git flow feature finish <โbranch nameโ>
release
๋ธ๋์น ์ฌ์ฉํ๊ธฐrelease
์ญ์ ๋น์ทํ๋ค.
๋จ, release
๋ ์ด๋ฒ ์ถ์๋ ๋ฒ์ ์ ์ํ QA๊ฐ ๋ชฉ์ ์ผ ๋ฟ์ด๋ค.
release
๋ธ๋์น ์ญ์ ํ์ฌ develop
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋๋ค.
git flow release start <โbranch nameโ>
QA๊ฐ ๋๋ ํ ์ค์ ๋ก ์ถ์๋ฅผ ํ๊ธฐ ์ํด release finish
๋ฅผ ์์ฒญํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์์
์ ํ๋ค.
release
๋ฅผ master
์ mergerelease
์ด๋ฆ์ผ๋ก ํ๊ทธ ๋ฑ๋กrelease
๋ฅผ develop
์ back-merge(์ฌ๋ณํฉ)release
์ญ์ ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ release ์ค๋น๊ฐ ๋๋ฌ์ผ๋ฏ๋ก pull
์์ฒญ์ผ๋ก remote repo
์ ์ฝ๋๋ฅผ ์ ์ถํ๋ฉด ๋๋ค.
์ด ๋ฐ์๋ hotfix
, feature/release ๋ณ๋ก pull/push๋ฅผ ํ ์ ์๋ค.
git flow hotfix git flow hotfix start <release>[<base>] git flow gotfix finish <release> git flow feature publish <name> git flow feature pull <remote> <name>
spf
๋ฅผ ์ด์ฉํ ์์ธ์๋ถํด์ผ์ ๋ฒ์ ๋ด์ ์์๋ฅผ ์ฐพ๋ ๊ฐ์ฅ ๋ณดํธ์ ์ธ ๋ฐฉ๋ฒ์ ์๋ผํ ์คํ
๋ค์ค์ ์ฒด
์ด๋ค.
์๋ผํ ์คํ
๋ค์ค์ ์ฒด
์ ๋ํด ๊ฐ๋ตํ ์ค๋ช
ํ์๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก 2๋ ์์๋ก ์ฒ๋ฆฌํด๋๊ณ [2..Range)๋ฅผ ์ํํ๋ฉฐ ์์์ธ ๊ฒ๋ค์ ๋ฐฐ์๋ค์ ๋ํด not prime์ผ๋ก ๋ง๋ค๋ฉฐ ๋ฐ๋ณตํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
const int RANGE = 1e7;
int np[RANGE]; // np[x] = x๊ฐ not prime์ธ์ง?
void getEratosthenes() {
for(int i = 2; i*i < RANGE; ++i) {
if(!np[i]) {
for(int j = i*i; j < RANGE; j += i) {
np[j] = 1;
}
}
}
}
์์๋ค์ ๋ฐฐ์๋ค์ ๋ํด not prime์ผ๋ก ์ฒ๋ฆฌ ํ ๋ i*i์์๋ถํฐ ์์ํ๋ค๋ ์ต์ ํ๋ฅผ ํ์ง๋ง, ๊ฒฐ๊ตญ ์ค๋ณต๋๋ ์์ ๋ํด not prime์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค.
๊ทธ ์๋ก $30=2\cdot3\cdot5$์์ $i=2$์ผ ๋ $2\cdot15$์์ $30$์ not prime ์ฒ๋ฆฌํ๊ณ , $i=3$์ผ ๋ $30$์ ์ค๋ณต์ผ๋ก not prime ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
์ด๋ก ์ธํด ์ด ์๊ฐ๋ณต์ก๋๋ $O(n\log{\log{n}})$์ด ๋๋ค. ์ฆ๋ช
์๋ผํ ์คํ
๋ค์ค์ ์ฒด
๋ ์ถฉ๋ถํ ๋น ๋ฅด๊ณ ๊ฐํธํ๋ฐ ์ด๋ณด๋ค ๋ ์ต์ ํ๋ฅผ ํ ์ ์์๊น?
๋๋๊ฒ๋ ์ค์ผ๋ฌ์ ์ฒด
๋ฅผ ์ฌ์ฉํ๋ฉด $O(n)$๋ง์ ์์๋ค์ ๊ตฌํ ์ ์๋ค.
๋ํ ์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ ์ํด ๊ฐ ์์ minimum prime factor
(์ต์ ์์ธ์ = spf
)๋ฅผ ๊ตฌํ๊ธฐ ๋๋ฌธ์ $O(\log{n})$๋ง์ ๋ฒ์ ๋ด์ ์๋ฅผ ์์ธ์๋ถํด ํ ์ ์๋ค.
์๋ผํ ์คํ
๋ค์ค์ ์ฒด
์์ ์ค๋ณต์ด ๋์ค๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ดํด๋ณด๋ฉด ์์์ ๋ฐฐ์๋ค์ ๋ํด not prime ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ถ๋ถ์์ ์์ * ํฉ์ฑ์
ํํ์ธ ๊ฒฝ์ฐ ์ค๋ณต๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๊ฒ์ ๋ค์ง์ด์ ์๊ฐํด โ๊ทธ๋ฅ ์ * ์์
์ ๋ํด not prime ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ์ ๋ ๊น?โ ๋ผ๋ ๋ฐ์์ ํด๋ณผ ์ ์๋ค.
๊ทธ๋ฅ ์์๋ฅผ ๊ณฑํด๋ฒ๋ฆฌ๋ฉด ์์ธ์๊ฐ 3๊ฐ ์ด์์ธ ๊ฒฝ์ฐ์๋ ๋ ์ค๋ณต์ด ๋์ฌ ๊ฒ ๋ปํ๋๊น ๋ชจ๋ ์๋ $x = spf * number$์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด ์์์ ์ด์ฉํด ์ * spf
์ธ ๊ฒฝ์ฐ์๋ง not prime์ ์ฒ๋ฆฌํ๋ฉด ์ค๋ณต์ ํผํ ์ ์๋ค๋ ์์ด๋์ด๊ฐ ๋์จ๋ค.
$x = number * spf(x)$์ธ x๋ค์ ๋ํด not prime์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ผํ ์คํ
๋ค์ค์ ์ฒด
์ ๋น์ทํ ๋ก์ง์ผ๋ก ์๊ฐํ๋ฉด ํธํ๋ค.
๋๋ต์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ผ๋จ ์๋ค์
์๋ผํ ์คํ ๋ค์ค์ ์ฒด
์ ๋น์ทํ๊ฒ [2..RANGE)๋ฅผ ์ํํ๋ฉฐ ๊ทธ๋ค์ spf๋ฐฐ๋ค์ ๋ํด not prime์ ์น ํ๋ค.์ํ ์ค ํ์ฌ not prime์ด ์น ํด์ง์ง ์์ ์๋ค์ ์์์์ด ์๋ช ํ๋ค.
not prime์ ์น ํ ๋๋ boolean ๋ฐฐ์ด์ ํตํด ์น ํ์ง ๋ง๊ณ ํด๋น ์์
spf
๋ฅผ ์ ์ฅํ๋ ์์ผ๋ก ๊ตฌํํด ๊ฐ ์์spf
๋ฅผ ์ ์ฅํด์ค๋ค.
์ด ๋ ๋ฌธ์ ๊ฐ ํ์ฌ ์ํ์ค์ธ ์๊ฐ $x$๋ผ๊ณ ํ์ ๋ $y = x*spf(y)$๋ฅผ not prime์ผ๋ก ์น ํ ๋ $spf(y)$๊ฐ ์ด๋ป๊ฒ $y$์ $spf$์ธ์ง ์๊ณ ์น ํ๋๋ ๊ฒ์ด๋ค.
์์์ ์ผ๋ก ์๊ฐํ๋ฉด ์ฌ์ด ๋ฌธ์ ์ธ๋ฐ, ํ์ฌ $x$์ ๋ํด $y$๊ฐ ๋ ์ ์๋ $spf(y)$๋ฅผ ๊ณ ๋ฅด๋ ์กฐ๊ฑด์ ์๋ ๋ ๊ฐ์ง๋ฅผ ๋ง์กฑ์ํค๋ฉด ๋๋ค.
- ์์์ฌ์ผํ๋ค.
- $spf(y) \leq spf(x)$
์ฆ, ํ์ฌ๊น์ง ๊ตฌํด์ง ์์๋ค์ $x$์ ๊ณฑํด๊ฐ๋ฉฐ $y$๋ฅผ ์น ํด๊ฐ๋๋ฐ, ์์๊ฐ $x$๋ณด๋ค ์ปค์ง๋ฉด ๋ฃจํ๋ฅผ ๋๋ ์์ผ๋ก ๊ตฌํํ๋ฉด ๋๋ค.
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
const int RANGE = 1e7;
int pn, spf[RANGE], pr[RANGE];
void eulerSieve() {
FOR(x, 2, RANGE) {
if(!spf[x]) spf[x] = pr[pn++] = x; // ํ์ฌ x์ ๋ํด spf๊ฐ ์ ํด์ง์ง ์์๋ค๋ ๊ฒ์ spf[x] = x๋ผ๋ ์๋ฏธ์ด๊ณ , x๊ฐ ์์๋ผ๋ ์๋ฏธ์ด๋ค.
for(int j = 0; x*pr[j] < RANGE; ++j) {
spf[x*pr[j]] = pr[j]; // ์ * spf๋ค์ ๋ํด spf[x*spf] = spf๋ก ์น ํด์ค๋ค.
if(x % pr[j] == 0) break; // spf[x] == pr[j]์ด๋ฉด ๊ทธ๋ง ๋๋ค. (์ด ์ด์ pr์ด ๋์ด๋๋ฉด x * pr์ ๋ํด ๋ ์ด์ spf๊ฐ pr์ด ์๋ x์ spf์ด๋๊น)
}
}
}
๋ถ์์ด๋ผ๊ณ ํ ๊ฒ๋ ์์ด ์ด๋ค ํฉ์ฑ์ $y = x * spf(y)$๋ฅผ not prime์ด๋ผ๊ณ ์น ํ ๋ ๊ฐ๋ฅํ x๋ ๋ฑ ํ ๊ฐ์ง์ด๋ฏ๋ก ๋ฌด์กฐ๊ฑด ํ ๋ฒ ๋ฐ์ ์น ํด์ง์ง ์๋๋ค.
์ค์ ๋ก $Range = 10^8$์ ๋ํด์ not prime์ด ์น ํด์ง๋ ๊ฒฝ์ฐ๋ฅผ ์ธ์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Eulerโs Sieve: 94,238,543ํ
Eratosthenesโs Sieve: 242,570,202ํ
spf
๋ฅผ ์ด์ฉํ ์์ธ์๋ถํดspf[x]
์์ฒด๊ฐ x
์ ์์ธ์๋ฅผ ๋ด๊ณ ์๊ธฐ ๋๋ฌธ์ ๋จ์ํ ๊ตฌํ๋ง ํ๋ฉด ๋๋ค.
x
์ ์์ธ์๊ฐ์ ๋งํผ ์ํํ๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋๋ $O(n)$์ด๋ค.
const int RANGE = 1e7;
int spf[RANGE];
void f(int x) {
assert(x > 0);
while(x > 1) {
cout << spf[x] << ' ';
x /= spf[x];
}
}
์ฝ๋ํฌ์ค Div2-C ๋ฌธ์ ์ด๋ค.
์ด ๋ฌธ์ ๋ฅผ ํตํด์ ์ค์ผ๋ฌ์ ์ฒด
์ ๋ํด์ ์๊ฒ ๋์๋๋ฐ, ์ผ๋ฐ์ ์ธ ์๋ผํ ์คํ
๋ค์ค์ ์ฒด
๋ ์์ธ์ ๋ถํด
๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋๋ ๋ฌธ์ ์ด๋ค.
$n$๊ฐ์ ์ซ์๋ค์ด ์ฃผ์ด์ง๋๋ฐ, ์ด ์ค ๋ช ๊ฐ๋ฅผ ์ง์์ผ ์๋ ์ซ์๋ค์ $gcd$๋ณด๋ค ๋จ์ ์ซ์๋ค์ $gcd$๊ฐ ์ปค์ง๊น?
$(2 \leq n \leq 3 \cdot 10^5)$, $(1 \leq {a_i} \leq 1.5 \cdot 10^7)$
$gcd$๋ ๋ชจ๋ ์ซ์๋ค์ ๊ณตํต ์ธ์ ์ค ๊ฐ์ฅ ํฐ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ๋ชจ๋ ์๋ค์ $gcd$๋ก ๋๋๊ณ ๋ ๋๋จธ์ง ์๋ค์ ๊ณตํต ์์ธ์๋ ์์ ๊ฒ์ด๊ณ , ๋ช ๊ฐ์ ์๋ฅผ ์ง์ ๊ณตํต ์์ธ์๋ฅผ ๋ง๋๋ ์๊ฐ $gcd$๊ฐ ์ฆ๊ฐํ๊ฒ ๋ ๊ฒ์ด๋ค.
์ฆ, ๋ชจ๋ ์๋ค์ ์์ธ์๋ถํดํด์ cnt[x]
๋ฐฐ์ด์ ๊ฐ ์์ธ์๊ฐ ๋ช ๋ฒ ๋ฑ์ฅํ๋์ง๋ฅผ ์ธ๊ณ , $n - max(cnt[x])$๋ฅผ ๊ตฌํด์ฃผ๋ฉด ๋๋ค.
์ด ๋ ์์ธ์๋ถํด๋ฅผ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ํด์๋ $n = 3 \cdot 10^5$์ด๊ณ , ์์ ๋ฒ์ ${a_i} = 1.5 \cdot 10^7$์ด๊ธฐ ๋๋ฌธ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ค.
์ค์ ๋ก $x$๋ฅผ ์์ธ์๋ถํด ํ ๋ $\sqrt{x}$๊น์ง์ ์์๋ค๋ก ๋๋ ๋ณด๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด๋ดค์ง๋ง ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค.
ํ์ง๋ง ์์์ ์ค๋ช
ํ ์ค์ผ๋ฌ์ ์ฒด
๋ฅผ ์ฌ์ฉํ๋ฉด $O(A + n \cdot \log{A})$ ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์๋ค.