이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
int get_union(vector<pair<int, int>> seg) {
vector<pair<int, int>> events;
for (auto [l, r] : seg) {
events.emplace_back(l, 1);
events.emplace_back(r + 1, -1);
}
sort(events.begin(), events.end());
int res = 0, cnt = 0;
for (int i = 0; i + 1 < events.size(); i++) {
cnt += events[i].second;
if (cnt > 0)
res += events[i + 1].first - events[i].first;
}
return res;
}
int gcd(int a, int b) {
while (b != 0) {
a %= b;
swap(a, b);
}
return a;
}
struct Event {
int x, type, pl, pr;
Event() {}
Event(int x, int type, int pl, int pr) : x(x), type(type), pl(pl), pr(pr) {}
};
bool operator<(Event a, Event b) {
return a.x < b.x || (a.x == b.x && -a.type < -b.type);
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, a, b;
cin >> n >> a >> b;
int p = a / gcd(a, b + 1);
vector<Event> events;
auto add = [&] (int l, int r, int pl, int pr) {
events.emplace_back(l, 1, pl, pr);
events.emplace_back(r + 1, -1, pl, pr);
};
while (n--) {
int l, r;
cin >> l >> r;
int L = l / b, R = r / b;
if (L == R)
add(l % b, r % b, L % p, R % p);
else {
int inside = R - L - 1;
if (inside > 0)
add(0, b - 1, (L + 1) % p, (R - 1) % p);
add(l % b, b - 1, L % p, L % p);
add(0, r % b, R % p, R % p);
}
}
sort(events.begin(), events.end());
multiset<pair<int, int>> seg;
ll ans = 0;
for (int i = 0; i + 1 < events.size(); i++) {
if (events[i].type == 1)
seg.insert({events[i].pl, events[i].pr});
else
seg.erase(seg.find({events[i].pl, events[i].pr}));
int diff = events[i + 1].x - events[i].x;
if (diff != 0) {
vector<pair<int, int>> to_union;
for (auto [l, r] : seg) {
if (l <= r)
to_union.emplace_back(l, r);
else {
to_union.emplace_back(0, r);
to_union.emplace_back(l, p - 1);
}
}
ans += (ll) diff * get_union(to_union);
}
}
cout << ans;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
strange_device.cpp: In function 'll get_union(std::vector<std::pair<long long int, long long int> >)':
strange_device.cpp:9:15: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
for (auto [l, r] : seg) {
^
strange_device.cpp:15:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i = 0; i + 1 < events.size(); i++) {
~~~~~~^~~~~~~~~~~~~~~
strange_device.cpp: In function 'int main()':
strange_device.cpp:71:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i = 0; i + 1 < events.size(); i++) {
~~~~~~^~~~~~~~~~~~~~~
strange_device.cpp:79:23: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
for (auto [l, r] : seg) {
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |