๋ฐฑ์ค ์๋ฒ ์ข ๋ฃ ์ ์ ๋ง์ง๋ง์ผ๋ก ๋ฃจ๋น ๋ฌธ์ ํ ๋ฒ์ ํ์ด๋ณด๊ณ ์ถ์ด์ ๋์ . ๋ง๋ฒ ์ด์ฒด๊ฐ "์์๋งํผ ๊ฐ์ ธ์ ๋ค์ ๋ถ๋ฐฐ"ํ๋ ๊ตฌ์กฐ๋ผ ์ ์ฒด ํฉ์ด ๋ฐ๋์ง ์๋ ๋ถ๋ณ๋๋ถํฐ ์ก๊ณ ์์. ์์๋ง์ผ๋ก๋ ์ ํ๋ ค์ ์์ ์ผ์ด์ค BFS๋ก ์ ๋ต์ ๊ตฌํด๋๊ณ , ์ ๋ ฅ ๋ฐฐ์ด์ ๋์ ํฉ๊ณผ ์ ๋ต ์ฌ์ด์ ํจํด์ ๋ ธ๊ฐ๋ค๋ก ๋งค์นญํ ๋์ "๊ฐ ์์์ i์์ ์์ ๋ถ๋ถํฉ๋ง๋ค โ|PS| / Tโ๋ฅผ ๋ํ๋ค"๋ ๊ท์น์ ๋ฐ๊ฒฌ
ki = -x (x > 0)์์ ๋ง๋ฒ ์ด์ฒด 1ํ ํ
ki : -x โ +x (๋ณํ๋ +2x)
์ด์: ๊ฐ๊ฐ -x (๋ณํ๋ -x์ฉ, ํฉ์ณ -2x)
์ธ ์นธ์ ํฉ ๋ณํ๋ 0, ๋ฐ๋ผ์ ๋ชจ๋ ์ํ์ ํฉ T๋ ์์ํ ๊ทธ๋๋ก. ๋ฌธ์ ์กฐ๊ฑด์ T > 0์ด ๋ณด์ฅ๋๋ฏ๋ก, ์ถฉ๋ถํ ๋ง๋ฒ์ ์ฐ๋ฉด ๋ฐ๋์ ๋ชจ๋ 0 ์ด์์ผ๋ก ์๋ ด ๊ฐ๋ฅ
์ํ ์ ์์์ ์์์ i์์ ์๊ณ๋ฐฉํฅ์ผ๋ก ๋ถ๋ถํฉ์ ์์๊ฐ ๋, ๋ถ๋ถํฉ์ด ์์๋ก ๋น ์ง๋ ๊น์ด๊ฐ ๊ณง ๊ทธ ๊ตฌ๊ฐ์์ ์ฑ์์ผ ํ ๋ถ์กฑ๋ถ. ํ ๋ฐํด ํฉ์ด T์ด๋ฏ๋ก ๊น์ด |PS|๋ฅผ ๋ฉ์ฐ๋ ค๋ฉด โ|PS| / Tโ ํ์ ์ด์ฒด๊ฐ ์์์ i์ ์ฒญ๊ตฌ๋จ. ์ด ๊ฐ์ ๋ชจ๋ ์์์ i, ๋ชจ๋ j์ ๋ํด ํฉ์ฐํ ๊ฒ ์ ๋ต
2๋ฐฐ ๋ณต์ : [1, -2, -1, 3, 1, -2, -1, 3]
๋์ ํฉ dp[1..8]: [1, -1, -2, 1, 2, 0, -1, 2]
| ์์ i | ๋ถ๋ถํฉ PS_j (j=i..i+N-1) | ์์๋ง โ/Tโ | ๊ธฐ์ฌ |
|---|---|---|---|
| 1 | 1, -1, -2, 1 | 1, 2 | 3 |
| 2 | -2, -3, 0, 1 | 2, 3 | 5 |
| 3 | -1, 2, 3, 1 | 1 | 1 |
| 4 | 3, 4, 2, 1 | (์์) | 0 |
์ดํฉ 9 โ ์์ ์ ๋ต ์ผ์น
๋งค ์์์ ๋ง๋ค ์ธ๋ฑ์ค wrap-around๋ฅผ ๋ฐ๋ก ๊ณ์ฐํ๋ฉด ์ฝ๋๊ฐ ์ง์ ๋ถํด์ง. ์
๋ ฅ์ 2N ๊ธธ์ด๋ก ๋ณต์ ํด ๋์ ํฉ์ ํ ๋ฒ๋ง ๋ง๋ค์ด๋๋ฉด, ์์์ i์์ j๊น์ง์ ๋ถ๋ถํฉ์ dp[j] - dp[i-1]๋ก O(1)์ ์ถ์ถ ๊ฐ๋ฅ
N=9999, |ki|=32000 ๊ทผ๋ฐฉ์ ์ต์ ์ ๋ ฅ์์ ๊ฒฐ๊ณผ๋ long ๋ฒ์๊น์ง ๋๋ฌ. int๋ก ๋๋ฉด ์กฐ์ฉํ ์ค๋ฒํ๋ก์ฐ
long[] dp = new long[2 * N + 1];
for (int i = 1; i <= N; i++) {
int v = Integer.parseInt(st.nextToken());
dp[i] = v;
dp[i + N] = v;
}
for (int i = 1; i <= 2 * N; i++) {
dp[i] += dp[i - 1];
}
long T = dp[N];
long ret = 0;
for (int i = 1; i <= N; i++) {
long base = dp[i - 1];
for (int j = i; j < N + i; j++) {
long ps = dp[j] - base;
if (ps >= 0) continue;
long neg = -ps;
ret += (neg + T - 1) / T;
}
}
System.out.println(ret);
O(Nยฒ)O(N)package rtaeho.week04.B10350;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine().trim());
StringTokenizer st = new StringTokenizer(br.readLine());
long[] dp = new long[2 * N + 1];
for (int i = 1; i <= N; i++) {
int v = Integer.parseInt(st.nextToken());
dp[i] = v;
dp[i + N] = v;
}
for (int i = 1; i <= 2 * N; i++) {
dp[i] += dp[i - 1];
}
long T = dp[N];
long ret = 0;
for (int i = 1; i <= N; i++) {
long base = dp[i - 1];
for (int j = i; j < N + i; j++) {
long ps = dp[j] - base;
if (ps >= 0) {
continue;
}
long neg = -ps;
ret += (neg + T - 1) / T;
}
}
System.out.println(ret);
}
}