๋๋ถ๋ถ์ ์ฝ๋ํฌ์ค ๋ผ์ด๋์ฒ๋ผ ์ด๋ฒ ๋ผ์ด๋๋ ๊ทธ๋ฆฌ๋ํ ์๊ฐ๊ณผ ๋ฌธ์ ๋ฅผ ์ผ๋ง๋ ์ ๋ถ์ํ๋์ง๊ฐ ์ค์ ์ธ ๋ผ์ด๋์๋ค.
A๋ฒ ๋ฌธ์ : ๊ทธ๋ฆฌ๋
์ซ์๊ฐ ์ฃผ์ด์ง๊ณ , ๊ฐ ๋จ๊ณ๋ง๋ค ์ซ์์์ $1$์ ๋นผ๊ฑฐ๋, $k$๋ก ๋๋์ด ๋จ์ด์ง๋ฉด ๋๋ ์ ์๋ค.
์ซ์๋ฅผ $0$์ผ๋ก ๋ง๋ค๋ ค๋ฉด ์ต์ ๋ช ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผํ๋?
$n$๋ถํฐ ์์ํด์ $0$์ด ๋ ๋๊น์ง ๋ค์์ ๋ฐ๋ณตํ๋ค,
ํ ๋จ๊ณ๋ง๋ค ์ต์ $k$์ฉ ๋๋์ด์ง๋ฏ๋ก ํ ์ฟผ๋ฆฌ ๋น ์๊ฐ๋ณต์ก๋๋ $\log 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); }
const i64 MOD = 1e9+7;
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a%MOD, n /= 2) { if(n%2) ret = ret*a%MOD; }
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 n, m;
void input() {
cin >> n >> m;
}
int solve() {
i64 ans = 0;
while(n) {
if(n%m != 0) {
ans += n%m;
n -= n%m;
}
if(n) {
n /= m;
++ans;
}
}
cout << ans << 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๋ฒ ๋ฌธ์ : ๊ทธ๋ฆฌ๋
๊ตฌํ
for n
: $n$๋ฒ ๋ฐ๋ณต๋ฌธend
: ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฐ๋ณต๋ฌธ ์ข
๋ฃadd
: $x$์ $1$์ ๋ํ๋ค. ๋จ, ๋ง์
๊ฒฐ๊ณผ๊ฐ $2^{32}-1$๋ณด๋ค ํฌ๋ฉด ์ค๋ฒํ๋ก๊ฐ ๋ฐ์ํ๋ค.์ 3๊ฐ์ง๋ก ์ด๋ฃจ์ด์ง ์ฝ๋๊ฐ ์์ ๋, ์ฝ๋ ์คํ ํ $x$๊ฐ์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
(๋จ, ์ค๊ฐ์ add
์ฐ์ฐ ์ค ์ค๋ฒํ๋ก๊ฐ ๋ฐ์ํ๋ฉด OVERFLOW!!!
๋ฅผ ์ถ๋ ฅํ๋ค.)
๊ตฌํ์ด ์๊ทผํ ๊น๋ค๋ก์ด ๋ฌธ์ ์ด๋ค.
์ผ๋จ ๊ธฐ๋ณธ์ ์ธ ์์ด๋์ด๋ ๊ฐ๋จํ๋ค.
for n
:์คํ์ ํตํด ๊ฐ์ ๊ณ์ ์์๋์ผ๋ฉฐ, ํ์ฌ๊น์ง ์์ธ ๊ฐ์ ๊ณฑ๋ค์ ๋ณ์ $f$์ ์ ์ฅํด๋๋ฉด ๋๋ค.end
: ์คํ ๋งจ ๋ง์ง๋ง์ ๋บ ํ, $f$์์ ๊ทธ ๊ฐ์ ๋๋๋ฉด ๋๋ค.add
: $x$์ $f$๋ฅผ ๋ํ๋ฉด ๋๋ค.๊ตฌํ์์ ๊น๋ค๋ก์ด ์ ์, ์ค๊ฐ์ $f$๊ฐ ์์ฒด๊ฐ ์์ฒญ๋๊ฒ ์ปค์ง ์ ์๋ค๋ ๊ฒ์ธ๋ฐ, ๋จ์ ๊ณ์ฐ์ผ๋ก๋ ์ต๋ ์ญ์ง์๋ก $2 \cdot 10^{5}$ ์๋ฆฌ์๊น์ง ์ปค์ง ์ ์์ด, BigInteger์ ์ฌ์ฉํ๋๋ผ๋ ๊ทธ ์ฐ์ฐ ์๋ ๋๋ฌธ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ ๊ฒ์ด๋ค.
๋ ๊น๋ค๋ก์ด ์ ์ด $f$๊ฐ ์ค๋ฒํ๋ก๊ฐ ๋ฌ๋ค๊ณ ํด์ ๋ต์ด ๊ผญ OVERFLOW!!!
๊ฐ ์๋๋ผ ์ค๊ฐ์ add
๋ง ์ด๋ฃจ์ด์ง์ง ์๋๋ค๋ฉด ์๋ฌด๋ฐ ๋ฌธ์ ๋ ์๋ค.
๋ฐ๋ผ์ for n
์ด ์ค๋ฒํ๋ก๊ฐ ๋ฐ์ํ ์๊ฐ, ์คํ ํฌ์ธํฐ ๋ณ์์ ์ค๋ฒํ๋ก๊ฐ ๋ฐ์ํ ๋ณ์์ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๊ณ , ์์ผ๋ก for n
๋ฌธ์ ๋ง๋๋ฉด ์ง์ $f$์ ๊ณฑํ์ง ์๊ณ ๊ทธ๋ฅ ์คํ์๋ง ์์๋๋ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
๋ํ end
๋ฅผ ํตํด ์ค๋ฒํ๋ก๊ฐ ๋ฐ์ํ ์คํ์ด pop ๋๋ค๋ฉด ๊ทธ ๋๋ ๋ค์ ์คํ ํฌ์ธํฐ ๋ณ์๋ฅผ ์๋ฌด๊ฒ๋ ๊ฐ๋ฆฌํค์ง ์๋ ์ํ๋ก ๋ ๊ฒ์ด๋ค.
๋ง์ฝ add
์ ์คํ ํฌ์ธํฐ ๋ณ์๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค๋ฉด, ๋ฐ๋ก OVERFLOW!!!
๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
#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); }
const i64 MOD = 0x7fffffffff;
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a%MOD, n /= 2) { if(n%2) ret = ret*a%MOD; }
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 lp, n, lim;
void input() {
cin >> lp;
}
int solve() {
lim = POW(2, 32)-1;
debug(lim);
stack<int> sta;
sta.push(1);
i64 f = 1;
int of = -1;
while(lp--) {
string t; cin >> t;
if(t == "add") {
n += f;
if(of != -1 || n > lim) {
cout << "OVERFLOW!!!" << ENDL;
return 0;
}
} else if(t == "for") {
i64 x; cin >> x;
if(of == -1) {
f *= x;
sta.push(x);
if(f > lim) of = sta.size();
} else sta.push(x);
} else {
if(of == -1) {
f /= sta.top();
sta.pop();
} else if(of == sta.size()) {
f /= sta.top();
sta.pop();
of = -1;
} else sta.pop();
}
}
cout << n << 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๋ฒ ๋ฌธ์ : ๊ทธ๋ฆฌ๋
$x$์ถ ์์ $n$๊ฐ์ ์ $x_i$๋ค์ด ์ฃผ์ด์ง๋ค.
$x$์ถ์์ ์๋ฌด ์ ์ ์ขํ $p$๋ฅผ ์ก์ $d_i = abs(p - x_i)$๋ค์ ๊ตฌํ์ ๋ ๊ทธ ์ค $k$๋ฒ์งธ๋ก ์์ ์๋ฅผ ์ต์ํํ๊ณ ์ถ๋ค.
๊ฐ ์ฟผ๋ฆฌ๋ง๋ค ์ฃํ $p$๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค.
๋ฌธ์ ์์ฒด๊ฐ ๊ฒ์ผ๋ก ๋ณด๊ธฐ์๋ ์๋นํ ๋ณต์กํด๋ณด์ธ๋ค.
์ฐ์ $p$๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ $f_k(p)$ ๊ฐ์ด 1์ฐจ ํน์ 2์ฐจ ํจ์ ๊ผด์ด ๋์ด ์ด๋ถ/์ผ๋ถ ํ์์ ํ ์ ์๋ ์ดํด๋ดค์ง๋ง, ๊ทธ๋ฐ ํน์ฑ์ ์์๋ค.
ํ์ง๋ง ์ ์ดํด๋ณด๋, $p$๋ฅผ ์ด๋๋ก ์ก๋ ๊ฒฐ๊ตญ์ ์ด๋ ๋ ์ $x_{i-1}, x_i$ ์ฌ์ด์ ์กด์ฌํ๋ค๋ ์ ์ ์์๋๋ค.
(๋ฌผ๋ก $x_1, x_n$ ๋ฐ๊นฅ ์ชฝ์ ์กด์ฌํ ์ ์์ง๋ง, ๊ทธ๋ฐ ๊ฒฝ์ฐ๋ ๋ฌด์กฐ๊ฑด ์ํด๋ฅผ ๋ณธ๋ค๋ ๊ฒ์ ์ฝ๊ฒ ์ ์ ์๋ค.)
์ด ๋ $d_i$๋ค์ ํญ์ $p$๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ผ๋ก ์ฐ์๋ $k$๊ฐ์ ์ ๋ค์ด ์ ํ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๊ฒ์ ๋ฐ๊ฟ๋งํ๋ฉด, $[x_iโฆx_{i+k-1}]$๋ค์ด $p$๋ฅผ ๊ธฐ์ค์ผ๋ก $d_1โฆd_k$๊ฐ ๋ ์ ์๋ ์ ๋ค์ด๋ผ๋ ๋ป์ด๊ณ , ๊ฒฐ๊ตญ ์ขํ๋ค ์ค ์ฐ์๋ $k$๊ฐ ์ ๋ค์ ๊ตฌ๊ฐ์ ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ์์ ๊ฒ์ ์ค์ ์ $p$๋ก ์ก์ผ๋ฉด $d_k$๊ฐ ์ต์ํ ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
#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); }
const i64 MOD = 1e9+7;
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a%MOD, n /= 2) { if(n%2) ret = ret*a%MOD; }
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;
i64 n, k, ar[MAXN];
void input() {
cin >> n >> k;
FOR(i, 0, n) cin >> ar[i];
}
int solve() {
i64 res = -1, cur = -1;
FOR(i, 0, n-k) {
if(res == -1 || cur > ar[i+k] - ar[i]) {
res = i, cur = ar[i+k] - ar[i];
}
}
cout << (ar[res+k] + ar[res]) / 2 << 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;
}
// ......................................... //
D๋ฒ ๋ฌธ์ : ๊ทธ๋ฆฌ๋
์ ๋ ฌ
$n$๊ฐ์ ์๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด ์ฃผ์ด์ง๊ณ , ์ด๊ฒ์ $k$๊ฐ์ ์ต์ํ ์์๋ฅผ $1$๊ฐ ์ด์์ฉ ๊ฐ์ง๊ณ ์๋ ์ฐ์๋ ๋ถ๋ถ ๋ฐฐ์ด๋ก ๋๋์ด์ผ ํ๋ค.
(๋ฌผ๋ก ๋ชจ๋ ๋ฐฐ์ด์ ์์๋ค์ ์ ํํ ํ๋์ ๋ถ๋ถ ๋ฐฐ์ด์ ์ํด์ผ ํ๋ค.)
์ด ๋, $f(i)$๋ฅผ $a_i$๊ฐ ์ํ ๋ถ๋ถ ๋ฐฐ์ด์ idx๋ผ๊ณ ํ ๋ $\sum\limits_{i=1}^n{a_i \cdot f(i)}$ ์ด ์ต๋๊ฐ ๋๋๋ก ๋ถ๋ถ ๋ฐฐ์ด๋ค์ ๋๋๊ณ , ๊ทธ ๊ฐ์ ์ฐพ์์ผํ๋ค.
(๋ถ๋ถ ๋ฐฐ์ด์ idx๋ ์ข์ธก๋ถํฐ $1$๋ถํฐ ์ฆ๊ฐํ๋ ์์ผ๋ก ๋ถ์ฌ๋๋ค.)
์ฐ์ ์์ ์์ ๊ฐ๋ ์ ์ผ๋ก ํ์ด์ ์ดํดํ๋ฉด, ์ผ๋จ ์ธ๊ทธ๋จผํธ ๋จ์๋ก ์ชผ๊ฐ ํ, ๊ฐ ์ธ๊ทธ๋จผํธ์ ๋ค์ด์๋ ์์๋ค์ ํฉ์ ์ธ๊ทธ๋จผํธ idx๋ฅผ ๊ณฑํ๊ฒ๋ค์ ํฉ์ ๊ตฌํ๋ ๊ฒ์ผ๋ก ๋ฐ๋๋ค. ์ฆ,
์ด๊ฒ์ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ํ ๊ฑธ์ ๋์๊ฐ ๊ด์ฐฐ ํ ์ ์๋ ์ค์ํ ์ฌ์ค์ด ์๋๋ฐ, ์ธ๊ทธ๋จผํธ์ idx๋ $1$์์๋ถํฐ ์ฆ๊ฐํ๋ค๋ ๊ฒ์ ์ด์ฉํด ์์ ์์ ์ผ์ข ์ ๋์ ํฉ์ผ๋ก ํํํ ์ ์๋ค.
์ฆ, ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ํํ๋ค.
์ด๊ฒ์ ์ด์ฉํด ๋ฐฐ์ด์ ๋๋ถ๋ถ๋ถํฐ ์์ํ๋ ๋์ ํฉ์ ๊ตฌํด ์ฐ์ ์ธ๊ทธ๋จผํธ $1$์ ๋ฐฐ์ด์ ์ ์ฒด๋ฅผ ์ปค๋ฒํ๋๊น ๋ฐ๋ก ๋นผ์ ๋ํ๊ณ , ๋๋จธ์ง ๋์ ํฉ ์ค ํฐ ์์ผ๋ก $k-1$๊ฐ๋ฅผ ๋ํ๋ฉด ๊ทธ๊ฒ ๋ฐ๋ก ์ต๋๊ฐ์ด ๋๋ค.
#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); }
const i64 MOD = 1e9+7;
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a%MOD, n /= 2) { if(n%2) ret = ret*a%MOD; }
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+10;
i64 n, k, ar[MAXN], ps[MAXN];
void input() {
cin >> n >> k;
RFOR(i, n-1, 0) cin >> ar[i];
}
int solve() {
FOR(i, 0, n) ps[i] = (i ? ps[i-1] : 0) + ar[i];
i64 ans = ps[n-1];
sort(ps, ps + n - 1, greater<i64>());
FOR(i, 0, k-1) ans += ps[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;
}
// ......................................... //
BOJ 15584(https://www.acmicpc.net/problem/15584)
$n$๊ฐ์ ์ ์ ์ ๊ฐ์ง ํธ๋ฆฌ๊ฐ ์๋ค.
Bessie๋ ์์์ ์ ์ ์์ ์์ํ์ฌ ์๋ฌด $leaf$๋ฅผ ํตํด ํ์ถํ๋ ค๊ณ ํ๊ณ , ๋๋ถ๋ค์ ์ฌ๋ฌ $leaf$์์ ์์ํ์ฌ Bessie๊ฐ leaf์ ๋๋ฌํ๊ธฐ ์ ์ ๋ถ์ก์ผ๋ ค๊ณ ํ๋ค.
Bessie์ ๋๋ถ๋ ๊ฐ์ ์ด๋์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ฐ๋ผ์ Bessie๋ ์ ์ ์์ ๋ถ์กํ๊ฑฐ๋ ๊ฐ์ ์ ๊ฑด๋๋ ๋์ค ๋ถ์กํ ์ ์๋ค.
Bessie์ ๋๋ถ๋ ํญ์ ์ต์ ์ ์๋ก ์์ง์ธ๋ค๊ณ ํ๊ณ , ๊ฐ ์ ์ ๋ง๋ค Bessie๊ฐ ํด๋น ์ ์ ์์ ์ถ๋ฐํ ๋ ์ ๋ leaf์ ๋๋ฌํ์ง ๋ชปํ๋๋ก ํ๊ธฐ ์ํด ๋ฐฐ์นํด์ผ ํ ๋๋ถ์ ์ต์ ์๋ฅผ ๊ตฌํด์ผ ํ๋ค.
(Bessie๊ฐ leaf์์ ์์ํ๋ ๊ฒฝ์ฐ์ ๋ํด์๋ ๊ตฌํด์ผํ๋ฉฐ, ์ด ๋๋ ํด๋น $leaf$์ ๋๋ถ๊ฐ ์์ผ๋ฉด ๋ถ์ก์ ์ ์๋ค.)
์ ๋ ฌ๋์ง ์์ ๋ฐฐ์ด์์ $k$๋ฒ์งธ ์์๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ ์ ๋ ฌ ํ ํ ๋ฐฐ์ด์ $k$๋ฒ์งธ ์์๊ฐ ๋ต์ด ๋๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ ๋ฌธ์ ๋ณด๋ค ์ฌ์ด ๋ฌธ์ ์ด๋ค.
์ด ๋ง์ ์ฆ, $k$๋ฒ์งธ ์์ ์ฐพ๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ํ $O(n\log{n})$ ๋ง์ ํ ์ ์๋ค๋ ๋ป์ด๋ค.
๊ทธ๋ฌ๋ Quick Sort
์ ์์ด๋์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๊ฒ์ $O(n)$๋ก ์ค์ผ ์ ์๋ค.
Quick Sort
๋ ์์์ $pivot$์ ๋ฝ์ ํฌ ํฌ์ธํฐ ํ์์ผ๋ก ํ์ฌ ๊ตฌ๊ฐ์ ์์ชฝ ๋์์ ์์ํ ํฌ์ธํฐ๋ฅผ ์ด๋์ํค๋ฉด์ ์ผ์ชฝ์ $x > pivot$์ธ ์์์ ์ค๋ฅธ์ชฝ์ $y < pivot$์ธ ์์๋ฅผ swapํด๊ฐ๋ฉฐ ๊ตฌ๊ฐ์ $pivot$๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒ๊ณผ ํฐ ๊ฒ์ผ๋ก ๋๋์ด ๋๋ ์ง ๋ ๊ตฌ๊ฐ์ ๋ํด ์ฌ๊ท์ ์ผ๋ก ์ด ๊ณผ์ ์ ์ ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
์ด ๋, ์ฐ๋ฆฌ๋ ํ ๊ฐ์ง ์๊ฐ์ ํ ์ ์๋ค.
$pivot$์ผ๋ก ์ธํด ๋๋ ์ง ๋ ๊ตฌ๊ฐ ์ค ํ๋๋ ์์ ์ฌ๊ท๋ฅผ ํ์ง ์์๋ ๋์ง ์์๊น?
์๋ํ๋ฉด
์ฆ, ์๋์ ๊ทธ๋ฆผ์ฒ๋ผ ์ฐ๋์ ๊ตฌ๊ฐ์ ๋ํด์๋ง ํ์ธ์ ํ๋ฉด ๋๋ค.
(๋ณด๋ผ์์ ๊ทธ ๋จ๊ณ์์์ $pivot$์ด๋ค.)
($pivot$์ ์ผ์ชฝ์ ๋ชจ๋ $pivot$์ ์ดํ์ด๊ณ , ์ค๋ฅธ์ชฝ์ ๋ชจ๋ $pivot$์ ์ด๊ณผ์์ ์ ์ํ์)
$pivot$์ ์์ฃผ ์ ์ก์์ ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ด์์ ์ผ๋ก ๊ตฌ๊ฐ์ ๋ฐ์ผ๋ก ๋๋๋ค๊ณ ์๊ฐํด๋ณด์.
๊ทธ๋ผ ์ด ์๊ฐ๋ณต์ก๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ ํ์ ์ผ๋ก ๋๋ค.
๊ทธ๋ฌ๋ ํผ๋ฒ์ ํ์ฌ ๊ตฌ๊ฐ์ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ์ ๊ฐ์ด ์ต์ ์ ๊ฒฝ์ฐ๋ก ์ก์ผ๋ฉด, $k=n-1$์ผ ๋ ์๊ฐ๋ณต์ก๋๊ฐ $O(n^2)$์ด ๋๋ค.
๋ฐ๋ผ์ Quick Sort
์ ๊ฒฝ์ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก $pivot$์ ์ ์ก๋ ๊ฒ์ด ์ค์ํ๋ค.
๋คํํ๋ C++ STL
์์๋ ์ด๋ฐ ๊ธฐ๋ฅ์ nth_element
ํจ์๋ก ๊ตฌํํด๋์๋ค.
ํญ์ $O(n)$์ ๋ณด์ฅํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ Median of medians ๊ธฐ๋ฒ์ ํ์ฉํ๋ Intro Select๊ฐ ์๋ค.
// k๋ 0-idx๋ก ๊ฐ์ ํ๋ค.
int n, ar[MAXN];
int qselect(int k) {
assert(k < n);
int s = 0, e = n-1;
while(1) {
// pivot = ar[s] (์๋๋ ๋๋คํ๊ฒ ๋ฝ์์ผ ํ์ง๋ง, ๊ฐ๋จํ๊ฒ ๊ตฌํํ๊ธฐ ์ํด)
int i = s, j = e;
while(1) {
while(i <= e && ar[i] <= ar[s]) ++i;
while(ar[j] > ar[s]) --j;
if(i >= j) break;
swap(ar[i], ar[j]);
}
swap(ar[s], ar[j]);
// k๋ฒ์งธ ์ฐพ์
if(j == k) return ar[j];
// ๊ตฌ๊ฐ ์กฐ์
else if(j < k) s = j+1;
else e = j-1;
}
}
BOJ 14458(https://www.acmicpc.net/problem/14458)
์ด๋ถ ๊ทธ๋ํ ํํ๋ก ์ ์ชฝ์ ์ ์ ์ด ๊ฐ๊ฐ $n$๊ฐ์ฉ ์๊ณ , ๊ฐ ๊ฐ์ ๋ค์ ๋ชจ๋ ์ผ๋์ผ ๋์ ํํ๋ก ์ฃผ์ด์ง๋ค.
์์ชฝ์ ์ ์ ๋ค์ ์ํ ํํ๋ก ํ์ ์ํฌ ์ ์์ผ๋, ํ ์ชฝ๋ง ์์์ $k$๋งํผ ํ์ ์ํค๋๊ฒ ๊ฐ๋ฅํ๋ค.
์ด ๋, ํ์ ์ ์ํจ ํ ๊ฐ์ ๋ค์ด ๊ต์ฐจ๋๋ ์ต์๊ฐ์ ์ฐพ์์ผ ํ๋ค.
์ผ๋์ผ ๋์, ๊ฐ์ ์ ๊ต์ฐจ๋ฅผ ๋ณด๋ฉด ๊ฐ์ฅ ๋จผ์ ์๊ฐ๋๋๊ฒ ๋น๋์๋ฅผ ์ฒดํฌํ๊ธฐ ์ข์ Fenwick Tree
์ด๋ค.
๊ฐ์ ์ ๊ต์ฐจ๋ผ๋ ๊ฒ์ ์ฆ, ์ด๋ค ๊ฐ์ ์ด $(u, v)$๋ฅผ ์๊ณ ์์ ๋
$u$ ์ด์ ์์ ์์ํ ๊ฐ์ ์ด $v$ ์ดํ๋ก ๊ฐ๋ค.
$u$ ์ดํ์์ ์์ํ ๊ฐ์ ์ด $v$ ์ด์ ์ผ๋ก ๊ฐ๋ค.
์ฆ, ๋ค์ ๋ ๊ฐ์ง ํํ ์ค ํ๋๋ก ๊ฐ์ ์ ๊ต์ฐจ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
์ฐ์ $k$๋งํผ ์ ์ ์ ํ์ ์ํค๋ ๊ฑด ๋์ค์ ํ๊ณ , ์ฒ์ ์ํ์์ ๊ฐ์ ์ ๊ต์ฐจ ์๋ฅผ ์ธ๋ณด์.
๊ฐ์ ์ ๊ต์ฐจ๊ฐ ์ด๋ฃจ์ด์ง๋ ๋ฐฉ์์ ์์์ ๋งํ๋๋ก์ด๊ณ , ์ด๊ฒ์ ํ ๋๋ก ์ด ๊ต์ฐจ ์๋ฅผ ์ธ๋ฉด ๋๋๋ฐ, ๋ฐฉ๋ฒ์ ๊ฐ๊ฐ์ ์ ์ ์ ๊ธฐ์ค์ผ๋ก $u$์ดํ์ ์ ์ ์์ ์์ํด์ $v$์ด์ ์ผ๋ก ๊ฐ๋ ๊ฒ์ ์ธ์ ์ ๋ถ ๋ํ ๊ฒ์ด๋ค.
์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ ์ค ํ๋๋ง ๊ตฌํ ์ด์ ๋, ๋ ๊ฐ์ง ๋ชจ๋ ์ธ๋ฒ๋ฆฌ๋ฉด ์ค๋ณต์ด ์๊ธฐ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๊ฒ์ ํธํ๊ฒ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ก Fenwick Tree
๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
Fenwick Tree
์ โ$u$์ดํ์์ ์์ํ๋ ๊ฐ์ ๋ค์ ๋์ โ์ idx์ 1์ ํ๊ธฐํด์ฃผ๋ฉด, $v$์ด์ ์ ์ ์ ๋ค์ ์๋ฅผ ์ฝ๊ฒ ๊ณ์ฐ ํ ์ ์๋ค.
์ ์ชฝ ์ค ํ๋๋ง ํ์ ์ํฌ ์ ์์ผ๋ฏ๋ก, ์ฐ์ ์ค๋ฅธ์ชฝ๋ง ํ์ ์ํค๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ๋ฉด ์ผ์ชฝ์ ํ์ ์ํค๋ ๊ฒฝ์ฐ๋ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๊ตฌํ ์ ์์ ๊ฒ์ด๋ค.
ํ์ฌ ์ํ์์์ ๊ต์ฐจ ๊ฐ์ ์ ์๋ ์ด๋ฏธ ๊ตฌํด์ ธ์๋ค๊ณ ๊ฐ์ ํ์ ๋, ๋ค์ $1$๋ฒ์ ํ์ ํ๋ฉด ๊ทธ ์๊ฐ ์ด๋ป๊ฒ ๋ณํ๋์ง๋ฅผ ์ ์ ์์ผ๋ฉด, $n$๋ฒ ํ์ ์ ์์ผ๋ณด๋ฉฐ ๊ทธ ๊ฐ์ ์ฝ๊ฒ ๊ตฌํ ์ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ ๋ณด๋ฉด, ํ์ ์ ํ ๋๋ ์ค๋ฅธ์ชฝ์ ๋งจ ๋ ์ ์ ๋ง ๋งจ ์์ผ๋ก ์ฎ๊ฒจ์ง์ ์ ์ ์๋ค.
ํ์ฌ ํ์ ๋์์ธ ์ ์ ์ ์๋ ๊ฐ์ ์ ๋ํด์ ์ผ์ชฝ ์ ์ ์ idx๋ฅผ $left$, ์ค๋ฅธ์ชฝ ์ ์ ์ idx๋ฅผ $right$๋ผ๊ณ ํ๋ฉด
ํญ์ $right = n-1$ ์ผ ๊ฒ์ด๊ณ , ์ด ๋ ํ์ฌ ์ด ๊ฐ์ ์ผ๋ก ์ธํด ์๊ธด ๊ต์ฐจ์ ์๋ $left$๊ฐ ๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
๋ํ $right$๋ฅผ $0$์ผ๋ก ํ์ ์์ผฐ์ ๊ฒฝ์ฐ ์๊ธฐ๋ ์๋ก์ด ๊ต์ฐจ์ ์๋ $n-left-1$๊ฐ ๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
์ฆ, ์๋ก์ด ์ด ๊ต์ฐจ์ ์๋ ์ด์ ๊ต์ฐจ์ ์์์ ํ์ฌ ๊ฐ์ ์ผ๋ก ์ธํด ์๊ธด ๊ต์ฐจ์ ์๋ฅผ ๋บ ๋ค ์๋ก ์๊ธฐ๋ ๊ต์ฐจ์ ์๋ฅผ ๋ํด์ฃผ๋ฉด ๊ตฌํ ์ ์๋ค.
#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); }
const i64 MOD = 1e9+7;
inline i64 POW(i64 a, i64 n) {
assert(0 <= n);
i64 ret;
for(ret = 1; n; a = a*a%MOD, n /= 2) { if(n%2) ret = ret*a%MOD; }
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...); }
// ....................................................... //
struct fenwick {
int n;
vi t;
void init(int _n) {
n = _n;
t.assign(n+1, 0);
}
void add(int u, int x) {
for(++u; u < t.size(); u += (u&-u)) {
t[u] += x;
}
}
int sum(int u) {
int ret = 0;
for(++u; u > 0; u -= (u&-u)) {
ret += t[u];
}
return ret;
}
};
const int MAXN = 1e5+10;
int n, ar[MAXN], br[MAXN], pa[MAXN], pb[MAXN];
fenwick ft;
void input() {
cin >> n;
FOR(i, 0, n) {
int x; cin >> x; --x;
ar[i] = x;
pa[x] = i;
}
FOR(i, 0, n) {
int x; cin >> x; --x;
br[i] = x;
pb[x] = i;
}
}
i64 getans() {
ft.init(n);
FOR(i, 0, n) ft.add(i, 1);
i64 sum = 0;
FOR(i, 0, n) {
ft.add(pb[ar[i]], -1);
sum += ft.sum(pb[ar[i]]);
}
i64 ans = sum;
RFOR(i, n-1, 0) {
sum += pa[br[i]];
sum -= (n-pa[br[i]]-1);
ans = min(ans, sum);
}
return ans;
}
int solve() {
i64 ans = getans();
FOR(i, 0, n) {
int t = ar[i];
ar[i] = br[i];
br[i] = t;
t = pa[i];
pa[i] = pb[i];
pb[i] = t;
}
ans = min(ans, getans());
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;
}
// ......................................... //
BOJ 2803(https://www.acmicpc.net/problem/2803)
$n$๊ฐ์ $m$์ข ๋ฅ์ ์ฅ๋๊ฐ์ด ๋ค์ด๊ฐ ์ ์๋ ์์๊ฐ ์๋ค.
๊ฐ ์์์๋ $m$์ข ๋ฅ ์ค ์ผ๋ถ์ ์ฅ๋๊ฐ๋ง์ด ๋ค์ด ์์ ๋,
๋ชจ๋ ์ข ๋ฅ์ ์ฅ๋๊ฐ์ ์ป์ ์ ์๋๋ก ์์๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์๋?
์ฆ, ์งํฉ์ $n$๊ฐ์ $m$-bit ์ซ์๋ค์ด ์์๋ก ์์ ๋,
๋ถ๋ถ ์งํฉ์ ์์๋ค์ or ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ $m$-bit์ $1111โฆ$์ด ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ธ๋ ๋ฌธ์ ์ด๋ค.
๋ค์๊ณผ ๊ฐ์ DP ์์ ์ฌ์ฉํ๋ฉด, $O(n \cdot 2^m)$ ์๊ฐ๋ณต์ก๋๋ก ํด๊ฒฐ ํ ์ ์๋ค.
$dp[i][mask] = ํ์ฌ$ $i$๊น์ง ๊ณ ๋ คํ์ ๋, $mask$ ์ํ๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์
ํ์ง๋ง, ์ด๋ ๊ฒ ๊ตฌํํ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋ ๊ฒ์ด ๋ถ๋ช ํ๋, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฐํด์ผ ํ๋ค.
์ ํํ $mask$๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ์ง ๋ง๊ณ , $mask$์ $submask$๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ๋ ๊ฒ์ด ๋ ํธํ ๊ฒ์ด๋ค.
๋ฐ๋ผ์
$b[x] = ์๋ค$ ์ค $x$์ ์๋ธ๋ง์คํฌ๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์
$c[x] = ์๋ค$์ or ๊ฒฐ๊ณผ๊ฐ$x$์ ์๋ธ๋ง์คํฌ๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์
$c[x] = 2^{b[x]}$๋ก ๊ตฌํ๋ฉด ๋๋๊น, $b[x]$๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ง ์๊ฐํ๋ฉด ๋๋ค.
๋ํ ์ด์ฐ๋๊ฑด or์ ๊ฒฐ๊ณผ๊ฐ ์ ํํ $x$๊ฐ ๋๋ ๊ฒฝ์ฐ๋ ๊ตฌํด์ผ ํ๋๊น, ์ด๊ฒ์ $a[x]$๋ผ๊ณ ํ์.
์ฐ์ $b[x]$์๋ ์ด๊ธฐ์ $x$์์ฒด์ธ ์ซ์์ ์๋ฅผ ๋ฃ์ด์ฃผ๊ณ , ๋ถํ ์ ๋ณต์ ํตํด ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ $b[x]$(OR ๊ฒฐ๊ณผ๊ฐ $x$์ submask๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์)๋ก ๋ง๋ค ๊ฒ์ด๋ค.
์ด ๋, ์ด ๊ณผ์ ์ ๊ฐ bit๋ฅผ ์ํํ๋ฉฐ $b[x์\ ith{-}bit๊ฐ\ ์ผ์ง\ ๊ฒฝ์ฐ]$์ $b[x์\ ith{-}bit๊ฐ\ ๊บผ์ง\ ๊ฒฝ์ฐ]$๋ฅผ ๋ํด๊ฐ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉ ํ ๊ฒ์ธ๋ฐ, ์ด๊ฒ์ ๊ตฌํํ๊ธฐ ์ํด ๋ถํ ์ ๋ณต์ ์ฌ์ฉ ํ ๊ฒ์ด๋ค.
์ฆ, ๋ค์๊ณผ ๊ฐ์ด $[0, 2^m)$๊ตฌ๊ฐ์ ๋ถํ ์ ๋ณตํ๋ฉฐ ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
(๋ค์ ๊ทธ๋ฆผ์ $m = 3$์ธ ๊ฒฝ์ฐ์ด๋ค.)
๊ฐ์ฅ ์์ ๊ตฌ๊ฐ $[000, 1000)$์์๋ $1st{-}bit$๊ฐ ์ผ์ง ๊ฒฝ์ฐ์ ๊ทธ๊ฒ์ด ๊บผ์ง ๊ฒฝ์ฐ๋ฅผ ๋ํ ๊ฒ์ด๊ณ , ์๋์์๋ ์ฌ๊ท์ ์ผ๋ก ๊ทธ๊ฒ์ ์ ์ฉํ ๊ฒ์ด๋ค.
(์ฆ, ๊ตฌ๊ฐ์ ๋ฐ์ผ๋ก ์ชผ๊ฐ๋ฉด $[000, 100), [100, 1000)$์ด ๋๋๋ฐ, ์ผ์ชฝ ๊ตฌ๊ฐ์ ๊ฐ์ ์ค๋ฅธ์ชฝ ๊ตฌ๊ฐ์ ๋ํ๋ ๊ฒ์ด๋ค.)
์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ ์ด ๊ตฌ๊ฐ์ด $2^m$(2์ ์ ๊ณฑ์) ํํ์ด๊ธฐ ๋๋ฌธ์, ๋ถํ ์ ๋ณต์ ํ ์ ๊ฐ ๋ ๋ฒจ์ ๊ธธ์ด๋ ํญ์ $2^{m-lv}$์ด ๋๊ณ , ๊ทธ ๋ ๋ฒจ์ ๋ฐ์ผ๋ก ์ชผ๊ฐค ๊ฒฝ์ฐ ํญ์ $(lv+1)$-bit๊ฐ ์ผ์ง๊ณ ๊บผ์ง ๊ฒฝ์ฐ๋ก ๋๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ๊ฒ ์ฌ๊ท์ ๋๊น์ง ๊ฐ๋ฉด ํญ์ $b[x]$๊ฐ ์ฐ๋ฆฌ๊ฐ ์ํ๋ โ$x$์ $submask$์ธ ์์ ์โ๊ฐ ๋จ์ ๋ณด์ฅ ํ ์ ์๋ค.
๊ทธ ์ด์ ๋ ์ฐ์ ์ต์์ ๋ ๋ฒจ์์๋ $b[x]$๊ฐ $1st{-}bit$์ด ์ผ์ง๊ณ ๊บผ์ง ๊ฒฝ์ฐ๋ฅผ ํฌํจํ๊ฒ ๋๊ณ , ๋ค์ ๋ ๋ฒจ์์๋ ์์ ๊ฒฐ๊ณผ๋ฅผ ์ด์ด๋ฐ๊ณ , $b[x]$๊ฐ $(1,2)th{-}bit$๊ฐ ์ผ์ง๊ณ ๊บผ์ง ๊ฒฝ์ฐ๋ฅผ ํฌํจํ๊ฒ ๋๊ณ , ์ด๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณตํ๋ฉด ๊ฒฐ๊ตญ ์ฌ๊ท์ ๋์์๋ $b[x]$๊ฐ $(1..m)th{-}bit$๊ฐ ์ผ์ง๊ณ ๊บผ์ง ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ํฌํจํ๊ฒ ๋๋๋ฐ, ์ด๊ฒ์ด ์ฆ $x$์ $submask$๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ํฌํจํ๋ค๋ ๊ฒ์ด๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก๋ top-down ๋ฐฉ์์ผ๋ก ์ฌ๊ท๋ฅผ ํ๋ฉฐ $b[x]$๋ฅผ ๊ตฌํด๊ฐ๋ ๊ฒ์ด๋ค.
$c[x] = 2^{b[x]}$๋ก ๊ฐ๋จํ๊ฒ ๊ตฌํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ํํ or ๊ฒฐ๊ณผ๊ฐ $x$๊ฐ ๋๋ $a[x]$๋ ์ด๋ป๊ฒ ๊ตฌํ ๊น?
์ด๊ฒ ์ญ์ ์์์ $b[x]$๋ฅผ ๊ตฌํ ๋ฐฉ๋ฒ๊ณผ ๋น์ทํ๊ฒ ๊ตฌํ ์ ์๋ค.
์ฆ, $c[x์\ ith{-}bit๊ฐ\ ์ผ์ง\ ๊ฒฝ์ฐ]$์์ $c[x์\ ith{-}bit๊ฐ\ ๊บผ์ง\ ๊ฒฝ์ฐ]$๋ฅผ ์ ์ ๋นผ๊ฐ๋ฉด ๊ฒฐ๊ตญ์ $a[x]$๊ฐ ๋๋ค๋ ๊ฒ์ ๊ฐ์ ๋ ผ๋ฆฌ๋ก ์ค๋ช ํ ์ ์๋ค.
๊ตฌํ์์๋ ์ง์ a[x], b[x], c[x]๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ๋์ ar[x]๋ฅผ ์ฌ์ฉํด์ ๊ทธ๊ฒ๋ค์ ๋์์ ํํํ๋๋ฐ, ์ด๊ฒ์ ์ ์ํ์ฌ ๋ณด๊ธธ ๋ฐ๋๋ค.
#ifndef ONLINE_JUDGE
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <bits/stdc++.h>
using namespace std;
// ........................macro.......................... //
// [i, n)
#define FOR(i, f, n) for(int (i) = (f); (i) < (int)(n); ++(i))
// [i, n]
#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 vector<int> vi;
typedef vector<vector<int> > vvi;
typedef vector<pair<int, int> > vii;
typedef vector<vector<pair<int, int> > > vvii;
typedef pair<int, int> ii;
typedef pair<int, pair<int, int> > iii;
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); }
const i64 MOD = 1e9+7;
inline i64 POW(i64 a, i64 n) {
if(n < 0) return 0;
i64 ret = 1;
while(n) { if(n % 2) ret *= a, ret %= MOD; a = a * a, a %= MOD; n /= 2; }
return ret;
}
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
cerr << " " << to_string(H);
debug_out(T...);
}
#ifndef ONLINE_JUDGE
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// ....................................................... //
const int MAXN = 1e6, MAXM = 20;
int n, m;
i64 ar[1<<MAXM];
void input() {
cin >> n >> m;
FOR(i, 0, n) {
int nn, k = 0; cin >> nn;
while(nn--) {
int x; cin >> x; --x;
k |= (1 << x);
}
++ar[k]; // ar[x]์ ์ด๊ธฐ ๊ฐ: x์ธ ์๋ค์ ๊ฐ์
}
}
// ๋ถํ ์ ๋ณต์ ๊ตฌ๊ฐ์ด ์ ํํ 2์ ์ ๊ณฑ์๊ฐ ๋๊ฒ ์ํํ๋ค.
// ์ด๋ ๊ฒ ํจ์ผ๋ก์จ, ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๊ตฌ๊ฐ์ ์ฐจ์ด๋ ์ ํํ 2^(len-1) ๋งํผ ๋๋ค.
// ์ฆ, ์ค๋ฅธ์ชฝ ๊ตฌ๊ฐ์ ์๋ค์ ์ผ์ชฝ ๊ตฌ๊ฐ์ ์๋ค์์ (len-1) bit๋ง ์ผ ๊ฒ๊ณผ ๊ฐ๋ค.
// ๋ํ ์ฌ๊ท ์ค ar[x]๊ฐ ์๋ฏธํ๋ ๋ฐ๊ฐ ๋ฌ๋ผ์ง๋ค!
// top-down ์ฌ๊ท๊ฐ ๋๋๊ณ ๋ ๋ฐ๋ก ๋ค์ ar[x] = b[x]
// leaf์์ ์์
์ด ๋๋๊ณ ๋ ๋ฐ๋ก ๋ค์ ar[x] = c[x]
// ๋ชจ๋ ๊ณผ์ ์ด ๋๋๊ณ ๋ ๋ค์ ar[x] = a[x]
void f(int s, int e) {
// leaf: top-down ์ฌ๊ท์ ๋ (c[x] = 2^b[x])
// ์ด ์์ ์ ar[x] = b[x]์ด๋ค.
if(s+1 == e) {
ar[s] = POW(2, ar[s]);
return;
}
// top-down ์ฌ๊ท๋ก b[x]๋ฅผ ๊ตฌํด๋๊ฐ๋ค.
int m = (s+e)/2;
FOR(i, m, e) ar[i] += ar[s+i-m];
f(s, m), f(m, e);
// top-down ์ฌ๊ท ๋๋๊ณ a[x]๋ฅผ ๊ตฌํ๋ ๊ณผ์
FOR(i, m, e) {
ar[i] -= ar[s+i-m];
if(ar[i] < 0) ar[i] += MOD;
}
}
int solve() {
f(0, 1 << MAXM);
cout << ar[(1 << m) - 1] << ENDL;
return 0;
}
// ................. main .................. //
void execute() {
input(), solve();
}
int main(void) {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
cin.tie(0); ios_base::sync_with_stdio(false);
execute();
return 0;
}
// ......................................... //
์์๋ณ์ ์์ด swap์ ํ๋ ์ ๋ฐํ์ง๋ง ์ค์ ๋ก ์ธ๋ชจ๋ ์๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.
๋ณดํต ๋ ๋ณ์๋ฅผ ๋ฐ๊พธ๋ swap ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ๋ค.
void swap(int& a, int& b) {
int t = a;
a = b;
b = t;
}
๊ทธ๋ฌ๋ฉด, ์์๋ณ์ t
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ swap
์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด ์์๊น?
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, xor
์ฐ์ฐ์ ์ด์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ ๊ฐ๋ฅํ๋ค.
void swap(int& a, int& b) {
a ^= b;
b ^= a;
a ^= b;
}
์ด ๊ณผ์ ์ ์ํ์ ์ผ๋ก ์จ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด swap
์ด ๋จ์ ์ ์ ์๋ค.
์ด๊ธฐ๊ฐ: $a = x, b = y$
a ^= b
: $a = x \oplus y$
b ^= a
: $b = y \oplus (x \oplus y) = x$
a ^= b
: $a = (x \oplus y) \oplus x = y$
์์ xor
์ ์ด์ฉํ ๋ฐฉ๋ฒ์ ์ ์ดํด๋ณด๋ฉด, ๊ฒฐ๊ตญ a
์ $x, y$ ๊ฐ์ ์์๋๊ณ , b
์์๋ $x, y$ ๊ฐ์์ $y$๊ฐ์ ์ ์ธํ ๊ฒ์ ๊ฐ์ ธ๊ฐ๊ณ , a
์์๋ $x, y$ ๊ฐ์์ $x$๊ฐ์ ์ ์ธํ ๊ฒ์ ๊ฐ์ ธ๊ฐ์ ์ ์ ์๋ค.
์ฆ, ์์๋๊ณ ๋บ ์ ์๋ ์ฐ์ฐ์ด๋ฉด ๋ชจ๋ ์ด๋ฐ ์์ผ๋ก ๊ตฌํ ํ ์ ์๋ค๋ ๊ฒ์ธ๋ฐ, ์ฌ์น์ฐ์ฐ์ด ์ด์ ํด๋นํ๋ค.
๋ง์ ์ ์ด์ฉ
void swap(int& a, int& b) { a += b; b = a - b; a = a - b; }
๊ณฑ์ ์ ์ด์ฉ($b \neq 0$)
void swap(int& a, int& b) { assert(b != 0); a *= b; b = a / b; a = a / b; }
๋จ, ์ด ๊ฒฝ์ฐ overflow ๋ฌธ์ ๊ฐ ๋ฐ์ ํ ์ ์์ผ๋, xor ์ฐ์ฐ์ ์ฌ์ฉํ๋๊ฒ ๋ ์์ ํ๊ณ ํจ์จ์ ์ด๋ค.
์์์ ์ฐ์ฐ์ ์์๋๊ณ ๋บ ์ ์๋ ํน์ฑ์ ์ด์ฉํ๋๋ฐ, ์ด ๋ ๋นผ๋ ๊ฒฝ์ฐ๋ฅผ ์ํ์ ์ผ๋ก ์ญ์์ด๋ผ๊ณ ์๊ฐ ํ ์ ์๋ค.
์ญ์์ด๋ ์์์ ์ฐ์ฐ $*$์ ํญ๋ฑ์ $e$๊ฐ ์กด์ฌ ํ ๋, $a$์ ๋ํด $a * b = b * a = e$ ์ธ $b$๊ฐ ์ ์ผํ๊ฒ ์กด์ฌํ ๋, $b$๋ฅผ $a$์ ์ญ์์ด๋ผ๊ณ ํ๋ค.
์ฆ, $b$์ ์ญ์ $rev(b)$๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ์ $a * b$ ์ํ์์ $a * b * rev(b) = a$, ์ฆ $b$๋ฅผ ์ ์ธ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์ด๊ฒ์ ์ด์ฉํ๋ฉด ์ญ์์ด ํญ์ ์กด์ฌํ๋ ์ฐ์ฐ $*$์ ์ด์ฉํด swap์ ๊ตฌํ ํ ์ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
int oper(int, int); // ์ญ์์ด ํญ์ ์กด์ฌํ๋ ์ด๋ค ์ฐ์ฐ
int rev(int); // ์ ์ฐ์ฐ์ ์ญ์์ ๊ตฌํ๋ค.
void swap(int& a, int& b) {
a = oper(a, b);
b = oper(a, rev(b));
a = oper(a, rev(b));
}