#include<cstdio>
#include<set>
typedef long long ll;
int n;
ll * a;
ll * r;
ll * c;
void input() {
scanf("%d", &n);
a = new ll[n];
r = new ll[n];
for (int i = 0; i < n; i++) {
scanf("%lld %lld", a + i, r + i);
}
}
// ll abs(ll a) {
// return a < 0 ? -a : a;
// }
void code() {
c = new ll[n];
for (int i = 0; i < n; i++) {
c[i] = (1 << i);
bool changed = true;
while(changed) {
changed = false;
for (int j = 0; j < n; j++) {
if ((c[i] & (1 << j)) != 0) {
for (int k = 0; k < n; k++) {
if ((c[i] & (1 << k)) == 0 && abs(a[j] - a[k]) <= r[j]) {
c[i] |= (1 << k);
changed = true;
}
}
}
}
}
}
// for (int i = 0; i < n; i++) {
// printf("%d %lld\n", i, c[i]);
// }
}
int count() {
std::set<ll> s1;
std::set<ll> s2;
s1.insert(0ll);
for (int i = 0; i < n; i++) {
for (std::set<ll>::iterator it = s1.begin(); it != s1.end(); it++) {
// printf("%lld %lld\n", c[i], c[i] | *it);
s2.insert(c[i] | *it);
s2.insert(c[i]);
s2.insert(*it);
}
s1 = std::set<ll>(s2);
// printf("size %lu %lu\n", s2.size(), s1.size());
s2.clear();
}
return s1.size();
}
int main() {
input();
code();
printf("%d\n", count());
return 0;
}
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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include<cstdio> #include<set> typedef long long ll; int n; ll * a; ll * r; ll * c; void input() { scanf("%d", &n); a = new ll[n]; r = new ll[n]; for (int i = 0; i < n; i++) { scanf("%lld %lld", a + i, r + i); } } // ll abs(ll a) { // return a < 0 ? -a : a; // } void code() { c = new ll[n]; for (int i = 0; i < n; i++) { c[i] = (1 << i); bool changed = true; while(changed) { changed = false; for (int j = 0; j < n; j++) { if ((c[i] & (1 << j)) != 0) { for (int k = 0; k < n; k++) { if ((c[i] & (1 << k)) == 0 && abs(a[j] - a[k]) <= r[j]) { c[i] |= (1 << k); changed = true; } } } } } } // for (int i = 0; i < n; i++) { // printf("%d %lld\n", i, c[i]); // } } int count() { std::set<ll> s1; std::set<ll> s2; s1.insert(0ll); for (int i = 0; i < n; i++) { for (std::set<ll>::iterator it = s1.begin(); it != s1.end(); it++) { // printf("%lld %lld\n", c[i], c[i] | *it); s2.insert(c[i] | *it); s2.insert(c[i]); s2.insert(*it); } s1 = std::set<ll>(s2); // printf("size %lu %lu\n", s2.size(), s1.size()); s2.clear(); } return s1.size(); } int main() { input(); code(); printf("%d\n", count()); return 0; } |
English