어흥
[CodeForces] Count Subrectangles (C++) 본문
728x90
반응형
문제 링크: https://codeforces.com/contest/1323/problem/B
1. 구현
- K의 약수를 먼저 구한다
- A와 B의 배열에서 (연속된 1의 개수, 해당 값의 개수)를 Map에 저장한다
- A의 처음부터 끝까지 K의 약수보다 큰수가 존재하면 (A의 수 - K +1)* A의 개수 만큼 더한다
- B의 처음부터 끝까지 K/A의 약수보다 큰 수가 존재하면 (B의 수 -K/A +1) * B의 개수 만큼 더한다
- 위 2개를 곱하고, K의 약수개수만큼 반복한다
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
long long num;
vector<int> v;
void cal() {
for (int i = 1; i*i <= num; i++) {
if (num%i == 0) {
v.push_back(i);
if (i*i != num)
v.push_back(num / i);
}
}
}
map<int, int> a;
map<int, int> b;
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int alen, blen, tt;
cin >> alen >> blen >> num;
int cnt = 0;
cal(); //약수 구하기
sort(v.begin(), v.end());
for (int i = 0; i < alen; i++) {
cin >> tt;
if (tt == 1) cnt++;
else {
if (cnt != 0) {
if (a.find(cnt) == a.end())
a[cnt] = 1;
else
a[cnt]++;
cnt = 0;
}
}
}
if (cnt != 0) {
if (a.find(cnt) == a.end()) a[cnt] = 1;
else a[cnt]++;
}
cnt = 0;
for (int i = 0; i < blen; i++) {
cin >> tt;
if (tt == 1) cnt++;
else {
if (cnt != 0) {
if (b.find(cnt) == b.end())
b[cnt] = 1;
else
b[cnt]++;
cnt = 0;
}
}
}
if (cnt != 0) {
if (b.find(cnt) == b.end()) b[cnt] = 1;
else b[cnt]++;
}
long long ans = 0;
for (int i = 0; i < v.size(); i++) {
int first = v[i];
int second = v[v.size() - 1 - i];
long long cnt1 = 0, cnt2 = 0;
for (auto it = a.begin(); it != a.end(); it++) {
if (it->first >= first) {
cnt1 += ((it->first - first + 1)*(it->second));
}
}
for (auto it = b.begin(); it != b.end(); it++) {
if (it->first >= second) {
cnt2 += ((it->first - second + 1)*(it->second));
}
}
ans += cnt1 * cnt2;
}
cout << ans;
return 0;
}
728x90
반응형
'알고리즘 > 코드포스' 카테고리의 다른 글
[CodeForces] Unusual Competitions (C++) (0) | 2020.03.08 |
---|---|
[CodeForces] Even Subset Sum Problem (C++) (0) | 2020.03.08 |
[CodeForces] Assigning to Classes (C++) (0) | 2020.03.07 |
[CodeForces] Longest Palindrome (C++) (0) | 2020.03.07 |
[CodeForces] Kuroni and Impossible Calculation (C++) (0) | 2020.03.04 |
Comments