Codeforces Round 918
ย - Last update: 2023-12-29

Codeforces Round 918 Upsolving

  • ๋Œ€ํšŒ ์ฐธ๊ฐ€ ์œ ๋ฌด: Y
  • ์ตœ์ข… Performance: 1756 (Rank: 229 / 27413)
  • Round ๋งํฌ: Top / Problems
  • ๋ฌธ์ œ๋ณ„ ๊ฒฐ๊ณผ
ABCDEFG
AC
AC
AC
AC
AC
AC
AC

Div 4๊ธด ํ•˜์ง€๋งŒ, ์ฒ˜์Œ ํ•ด๋ณด๋Š” All Solve! ํ•œ ํ•ด์˜ ๋งˆ์ง€๋ง‰ ์ฝ”ํฌ๋กœ ์žฌ๋ฐŒ๊ฒŒ ์ฐธ๊ฐ€ํ–ˆ๊ณ , ๋ฟŒ๋“ฏํ–ˆ๋‹ค.

A - Odd One Out

๋ช‡๋ฒˆ ๋‚˜์™”๋˜ A ^ B ^ C ๊ตฌํ•˜๊ธฐ ๋ฌธ์ œ. ๊ฐ™์€ ์ˆ˜๋Š” ๋‘๋ฒˆ XORํ•˜๋ฉด ์‚ฌ๋ผ์ง„๋‹ค!

B - Not Quite Latin Square

๋‹จ์ˆœ ๊ตฌํ˜„ ๋ฌธ์ œ. ์—†๋Š” ๋ฌธ์ž๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

C - Can I Square?

๋‚˜๋Š” ๊ทธ๋ƒฅ ์ˆซ์ž ๋‹ค ๋”ํ•œ ๋‹ค์Œ์— sqrt ๋•Œ๋ฆฐ ํ›„ ์ œ๊ณฑํ•ด์„œ ์›๋ž˜ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ค๋Š”์ง€๋กœ ๋ดค๋‹ค. ์ •์ˆ˜์˜ sqrt๋Š” ์ •ํ™•ํ•˜๊ฒŒ ๊ณ„์‚ฐ๋œ๋‹ค. (์ œ๊ณฑ์ˆ˜๊ฐ€ ๋งž์„ ๊ฒฝ์šฐ)

D - Unnatural Language Processing

C, V๊ฐ€ ์ •์˜๋˜๊ณ , greedy ํ•˜๊ฒŒ ๋‹จ์–ด๋ฅผ ๋Š์–ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ. ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ• ๊ฒŒ ๋ณ„๋กœ ์—†์—ˆ๋‹ค.

E - Romantic Glasses

๋‚˜๋Š” ์ด๊ฒŒ F๋ณด๋‹ค ์‰ฌ์› ๋‹ค. F ํ’€๊ณ  E๋ฅผ ํ’€์—ˆ๋‹ค. ๊ทธ๋ƒฅ ์ˆ˜์‹์„ ๋ณด๊ณ  ์žˆ์ž๋ฉด ๋ฒ”์œ„ ์ˆ˜์˜ ํ•ฉ์„ ์–ด๋–ป๊ฒŒ ๋นจ๋ฆฌ ๊ตฌํ•˜์ง€? ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฝ”ํฌ ๋ฌธ์ œ๊ฐ€ ๋Š˜ ๊ทธ๋ ‡๋“ฏ ์ง์ˆ˜ & ํ™€์ˆ˜๋ฅผ ๋‚˜๋ˆ  ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹ต์ด ๊ธˆ๋ฐฉ ๋‚˜์˜จ๋‹ค. ์ฐจ์ด๋ฅผ ์ƒ์‡„ํ•  ์ˆ˜ ์žˆ๋Š๋ƒ๊ฐ€ ํฌ์ธํŠธ.

F - Greetings

์›ฐ๋…ผ์ธ ๊ฒƒ๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ, solved tier ๊ธฐ์ค€ ์ด๋Ÿฐ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ๊ธฐ์ดˆ ํ™œ์šฉ ์œ ํ˜•์€ P5 ํ‹ฐ์–ด๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ž…๋ ฅ์„ ์„ ๋ถ„์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ , ์‹œ์ž‘์  ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•ด์„œ ๋ฃจํ”„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฃจํ”„๋Š” ๋์  ๊ธฐ์ค€์œผ๋กœ ์ง‘์–ด๋„ฃ์œผ๋ฉด์„œ(๊ทธ๋ฆฌ๋”” ๋ฌธ์ œ ๋Œ€ํ‘œ ์œ ํ˜•์ธ Job Scheduling ๋ฌธ์ œ์—์„œ ์“ฐ๋˜ ๋ฐฉ์‹์ด๋‹ค.), ๊ธฐ์กด์˜ ์„ ๋ถ„์„ ๋ช‡๊ฐœ ๊ต์ฐจํ•˜๋Š”์ง€ ์„ธ๋ฉด ๋œ๋‹ค. ์ด ๊ณผ์ •์—์„œ Segment Tree๋‚˜ PBDS๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ๋‚˜๋Š” PBDS๋กœ ํ’€์—ˆ๋‹ค. PBDS์˜ order_of_key ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ฟผ๋ฆฌ๋‹น O(logโกN)O(\log N)์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์„œ ํŽธํ•˜๋‹ค.

G - Bicycles

๋ฐฑ์ค€์— ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ , P5๋ฅผ ๋ฐ›์•˜๋‹ค.

์ •ํ•ด๋Š” ์ž์ „๊ฑฐ ์ตœ์†Œ ๊ฐ€๊ฒฉ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ์— ์“ฐ์ด๋Š” ๋ฐฐ์—ด์„ ํ™•์žฅํ•ด์„œ, dp[1001] ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋น„์šฉ์ด 1000๊นŒ์ง€๋กœ ์ œํ•œ๋˜์–ด ์žˆ๊ณ , ์ด๊ฒƒ์ด ์ถœ์ œ ์˜๋„๋กœ ๋ณด์ธ๋‹ค.

๋‹ค๋งŒ, ์ž์ „๊ฑฐ ๊ฐ€๊ฒฉ์ด ์ ์–ด๋„ 1์ด๋ผ๋Š” ์ ์„ ์ด์šฉํ•ด์„œ, ๋ฐฑํŠธ๋ž˜ํ‚น์„ ๋นก์„ธ๊ฒŒ ์ ์šฉํ•˜๋ฉด ์ด ์—ญ์‹œ๋„ AC๋ฅผ ๋ฐ›๋Š”๋‹ค. ์•„๋ž˜๋Š” ์ด ์ ์„ ํ™œ์šฉํ•œ ํ’€์ด์ด๋‹ค. ์ฃผ์œ ์†Œ ๋ฌธ์ œ๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํ’€๋ฆฐ๋‹ค. ์ •ํ•ด๋ฅผ ๋ชฐ๋ž์–ด์„œ 12ํ‹€ ํ•œ๊ฒƒ์€ ์•ˆ ๋น„๋ฐ€์ด๋‹ค.

๐Ÿ‘‰ ํŽผ์น˜๊ธฐ
struct Edge {
int v;
ll w;
short min;
bool operator<(const struct Edge& t) const {
if (w != t.w) return w > t.w;
return v < t.v;
}
};
int mdist[1001][1001];
vector<Edge> e[1001];
short s[1001];
int N, M;
void solve() {
scanf("%d %d", &N, &M);
for(int i = 1; i <= N; ++i) e[i].clear();
memset(mdist, 0x3F, sizeof(int) * 1001 * 1001);
FOR(i,0,M) {
int u, v, w; scanf("%d %d %d", &u, &v, &w);
if (mdist[u][v] > w) mdist[u][v] = w;
if (mdist[v][u] > w) mdist[v][u] = w;
}
FOR(i,1,N+1) {
FOR(j,1,N+1) {
if (i == j) continue;
if (mdist[i][j] >= 0x3F3F3F3F) continue;
e[i].push_back({j, mdist[i][j], -1});
}
}
FOR(i,1,N+1) {
ll tmp; scanf("%lld", &tmp);
s[i] = tmp;
}
ll minw[1001];
ll mins[1001];
memset(minw, 0x3F, sizeof(ll) * 1001);
memset(mins, 0x3F, sizeof(ll) * 1001);
priority_queue<Edge> pq;
pq.push({1, 0, 2000});
while(pq.size()) {
auto cur = pq.top(); pq.pop();
// _D("checking %d: %lld\n", cur.v, cur.w);
if (cur.v == N) {
printf("%lld\n", cur.w);
return;
}
short cmin = min(cur.min, s[cur.v]);
for(auto& edge: e[cur.v]) {
if (edge.min == cmin) continue;
edge.min = cmin;
ll tmp = (ll)cur.w + (ll)edge.w * cmin;
if (minw[edge.v] > tmp || mins[edge.v] > cmin) {
pq.push({edge.v, tmp, cmin});
minw[edge.v] = tmp;
mins[edge.v] = cmin;
}
}
}
assert(false);
printf("ERR!\n");
}
๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: