์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ๋ต ๋น์จ |
1 ์ด | 256 MB | 21.446 % |
1208๋ฒ: ๋ถ๋ถ์์ด์ ํฉ 2
์ฒซ์งธ ์ค์ ์ ์์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ N๊ณผ ์ ์ S๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 40, |S| ≤ 1,000,000) ๋์งธ ์ค์ N๊ฐ์ ์ ์๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ฃผ์ด์ง๋ ์ ์์ ์ ๋๊ฐ์ 100,000์ ๋์ง ์๋๋ค.
www.acmicpc.net
๋ฌธ์
N๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด์ด ์์ ๋, ํฌ๊ธฐ๊ฐ ์์์ธ ๋ถ๋ถ์์ด ์ค์์ ๊ทธ ์์ด์ ์์๋ฅผ ๋ค ๋ํ ๊ฐ์ด S๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ฒซ์งธ ์ค์ ์ ์์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ N๊ณผ ์ ์ S๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 40, |S| ≤ 1,000,000) ๋์งธ ์ค์ N๊ฐ์ ์ ์๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ฃผ์ด์ง๋ ์ ์์ ์ ๋๊ฐ์ 100,000์ ๋์ง ์๋๋ค.
ํด๊ฒฐ
key point, ๋ถ๋ถ์งํฉ์ ์ฌ๊ท์ ์ผ๋ก ์ฐพ๊ธฐ์ N์ด ๋๋ฌด ํฌ๊ธฐ ๋๋ฌธ์ ์ ๋ฐ์ผ๋ก ๋๋๋ค.
- ์ ์ N๊ฐ๋ฅผ ํ์, ์ง์๋ก ๋๋ ์ ๋ ฅ๋ฐ๋๋ค. → seq
- ๋นํธ๋ง์คํฌ๋ฅผ ํ์ฉํด ๋ถ๋ถ์งํฉ์ ๊ตฌํ๋ค. → sub
- ๋ฐ๋์ ์ ๋ ฌํ๋ค.
- ์ ๋ ฌ์ ํด์ผ ๋ถ๋ถ์งํฉ์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ด์ ๊ฐ ์์ด์ง!
- ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋ ๋ถ๋ถ์งํฉ์ ํฌ ํฌ์ธํฐ๋ฅผ ํ์ฉํด ํฉ์ด S๊ฐ ๋๋ ์๋ฅผ ์ฐพ๋๋ค.
- l์ left๋ก ๊ฐ์ฅ ์์ ๊ฐ(sub[0]์ ์์์ )์ ๊ฐ๋ฆฌํค๊ณ , r์ right๋ก ๊ฐ์ฅ ํฐ ๊ฐ(sub[1]์ ๋์ )์ ๊ฐ๋ฆฌํจ๋ค.
- *l + *r ์ ๊ฐ์ด
- S๋ณด๋ค ํฌ๋ฉด r์ ์ผ์ชฝ์ผ๋ก ํ ์นธ ๋น๊ธฐ๊ณ (--r)
- S๋ณด๋ค ์์ผ๋ฉด l์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ๋น๊ธฐ๊ณ (++l)
- S์ ๊ฐ์ผ๋ฉด l์ *l ๋ณด๋ค ์ต์ด๋ก ํฐ ๊ฐ์ธ ๊ณณ(upper_bound)์ผ๋ก ์ด๋ํ๊ณ , r์ *r ๋ณด๋ค ์ต์ด๋ก ์์ ๊ฐ์ธ ๊ณณ(lower_bound - 1)์ผ๋ก ์ด๋ํ๋ค. → p0.second, p1.first
- ๋ง์ง๋ง์ผ๋ก ์ฐพ๋ S๊ฐ 0์ด๋ผ๋ฉด, ๋ถ๋ถ์งํฉ์ ๊ตฌํ์ ๋น์ ๊ณต์งํฉ(0)์ ํฌํจํ์ฌ ๊ตฌํ๊ธฐ ๋๋ฌธ์ ๊ณต์งํฉ์ ์ ์ธํ๊ณ ์ถ๋ ฅํ๋ค. → ans--;
์ฝ๋
๋ฉ๋ชจ๋ฆฌ | ์๊ฐ |
13528 KB | 292 ms |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
int main() {
int n, s;
scanf("%d%d", &n, &s);
vector<int> seq[2], sub[2];
for (int i = 0, num; i < n; ++i) {
scanf("%d", &num);
seq[i % 2].push_back(num);
}
for (int i = 0; i < 2; ++i) {
//๋นํธ๋ง์คํฌ๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ ๋ถ๋ถ์งํฉ ํ์ธ
for (int j = 0; j < (1 << seq[i].size()); j++) {
int sum = 0;
for (int k = 0; k < seq[i].size(); ++k)
if (j & (1 << k)) sum += seq[i][k];
sub[i].push_back(sum);
}
sort(sub[i].begin(), sub[i].end());
}
auto l = sub[0].begin(), r = sub[1].end() - 1;
ll ans = 0;
while (l != sub[0].end() && r >= sub[1].begin()) {
if (*l + *r == s) {
auto p0 = equal_range(sub[0].begin(), sub[0].end(), *l);
auto p1 = equal_range(sub[1].begin(), sub[1].end(), *r);
ans += (p0.second - p0.first) * (p1.second - p1.first);
l = p0.second;
r = p1.first;
if (r == sub[1].begin()) break;
--r;
}
else if (*l + *r > s) {
if (r == sub[1].begin()) break;
--r;
}
else ++l;
}
if (s == 0) ans--;
printf("%lld", ans);
return 0;
}
|
cs |
๋ค๋ฅธ ํ์ด(lower_bound, upper_bound)
๋ฉ๋ชจ๋ฆฌ | ์๊ฐ |
13528 KB | 324 ms |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
// num๊ณผ ๊ฐ์ด ๊ฐ์ ์์ ๊ฐ์ ์ฐพ๋ ํจ์
ll count(vector<int>& seq, int num) {
// upper_bound(begin, end, num) -> ๊ตฌ๊ฐ์์ num๋ณด๋ค ํฐ ์๋ค ์ค ์ต์๊ฐ
// lower_bound(begin, end, num) -> ๊ตฌ๊ฐ์์ num๋ณด๋ค ์์ง ์์ ๊ฐ ์ค ์ต์๊ฐ
return upper_bound(seq.begin(), seq.end(), num) - lower_bound(seq.begin(), seq.end(), num);
}
int main() {
int n, s;
scanf("%d%d", &n, &s);
vector<int> seq[2], sub[2];
for (int i = 0, num; i < n; ++i) {
scanf("%d", &num);
seq[i % 2].push_back(num);
}
for (int i = 0; i < 2; ++i) {
//๋นํธ๋ง์คํฌ๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ ๋ถ๋ถ์งํฉ ํ์ธ
for (int j = (1 << seq[i].size()); j > 0; j--) {
int sum = 0;
for (int k = 0; k < seq[i].size(); ++k)
if (j & (1 << k)) sum += seq[i][k];
sub[i].push_back(sum);
}
sort(sub[i].begin(), sub[i].end());
}
auto l = sub[0].begin(), r = sub[1].end() - 1;
ll ans = 0;
while (l != sub[0].end() && r >= sub[1].begin()) {
if (*l + *r == s) {
ans += count(sub[0], *l) * count(sub[1], *r);
l = upper_bound(sub[0].begin(), sub[0].end(), *l);
r = lower_bound(sub[1].begin(), sub[1].end(), *r);
if (r == sub[1].begin()) break;
r--;
}
else if (*l + *r > s) {
if (r == sub[1].begin()) break;
--r;
}
else ++l;
}
if(s == 0) ans--;
printf("%lld", ans);
return 0;
}
|
cs |
์๊ฐ์ด๊ณผ
- lower_bound, upper_bound๋ฅผ ํ์ฉํด ๋ฌธ์ ๋ฅผ ํ์์ ๋๋ ์๊ฐ์ด๊ณผ๊ฐ ๋์, ์์ ์ฝ๋ ์ฒ๋ผ equal_range ํจ์๋ฅผ ํ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์๋ค.
- ๋ญ๊ฐ ๋ฌธ์ ์ธ์ง ์ฐพ์๋ณด๊ธฐ ์ํด ์ฝ๋๋ฅผ ๋ณํํด๊ฐ๋ฉฐ ์ ์ถํด๋ดค๋๋ฐ ์ ๋ต์ count ํจ์์ ์์๋ค.
ll count(vector<int> seq, int num) {
return upper_bound(seq.begin(), seq.end(), num) - lower_bound(seq.begin(), seq.end(), num);
}
ll count(vector<int>& seq, int num) {
return upper_bound(seq.begin(), seq.end(), num) - lower_bound(seq.begin(), seq.end(), num);
}
- ๋ ์ฝ๋์ ์ฐจ์ด๋ ํจ์ ์ ์ธ๋ฌธ์ ์๋ค.
- 'll count(vector<int> seq, int num)'์ด ์๋๋ผ 'll count(vector<int>& seq, int num)'๋ผ๊ณ ์์ฑํด์ผ ์๊ฐ์ด๊ณผ๊ฐ ๋์ง ์๊ณ ์ ๋ต์ฒ๋ฆฌ๊ฐ ๋๋ค!
- ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ vector<int> seq๋ก ๋ชจ๋ ๋ฐฐ์ด์ ๋ด์ฉ์ด ๋ณต์ฌ๊ฐ ๋์ด ๊ณต๊ฐ๊ณผ ์๊ฐ์ด ๋ฐฐ์ด์ ํฌ๊ธฐ๋งํผ ํ ๋น, ํ ์ ๊ฐ ๋๊ณ , ๋ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ &์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ์ฃผ์๊ฐ๋ง ์ ๋ฌ๋ฐ์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ํจ์ฌ ํฉ๋ฆฌ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
- ํนํ๋ N์ด 40์ด๋ฉด ๊ทธ ์ ๋ฐ์ด 20์ผ ๋, ๋ถ๋ถ์งํฉ์ ํฌ๊ธฐ๋ ์ต๋ ์ต์ด ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ฐจ์ด๊ฐ ๋ ํฐ ๊ฒ ๊ฐ๋ค.
- ์ด์ ๊น์ง๋ ํฐ ๊ฒฝ๊ฐ์ฌ์ ๊ฐ์ง ์๊ณ ๋ ๊ฐ์ง ๋ชจ๋ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์ฌ์ฉํ๋ ํฐ๋ผ ์ด๋ฒ ๋ฌธ์ ๋ก ์ค์์ฑ์ ์๊ฒ๋ ๊ฒ ๊ฐ๋ค.
'๐ฅ PS(Problem Solving) ๐ฅ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #10942 ํฐ๋ฆฐ๋๋กฌ? (0) | 2021.02.09 |
---|---|
[BOJ] #2632 ํผ์ํ๋งค (0) | 2021.02.05 |
[BOJ] #12100 2048 (0) | 2020.09.18 |
[BOJ] #2143 ๋ ๋ฐฐ์ด์ ํฉ (0) | 2020.08.19 |
[BOJ] #15831 ์คํ์ ์กฐ์ฝ๋ (0) | 2020.08.19 |
๋๊ธ