///MEMENTO MEMO, MEMENTO LONG LONG #include <bits/stdc++.h> #define DEBUG if(0) #define COUT cout << "\e[36m" #define ENDL "\e[39m" << endl #define VAR(v) " [\e[32m" << #v << "\e[36m=\e[91m" << v << "\e[36m] " using namespace std; typedef long long LL; unsigned int n; struct Mine { LL pos, r; }; vector<Mine> field; string demask(unsigned int mask) { string out; for (int i = 0; i < n; ++i) { out += (char)((int)(bool)(mask&(1u<<i))+(int)'0'); } return out; } unsigned int explode(unsigned int mask) { unsigned int fired = 0; for (unsigned int i = 0; i < n; ++i) { if(mask&(1u<<i) && !(fired&(1u<<i))) { fired = fired|(1u<<i); LL b= field[i].pos-field[i].r; LL e= field[i].pos+field[i].r; int lix= i, rix = i; while((lix >= 0 && b <= field[lix].pos) || ((rix < n) && field[rix].pos <= e)) { if(lix >= 0 && b <= field[lix].pos) { fired = fired|(1u<<lix); b = min(b, field[lix].pos-field[lix].r); e = max(e, field[lix].pos+field[lix].r); lix--; } if(rix < n && field[rix].pos <= e) { fired = fired|(1u<<rix); b = min(b, field[rix].pos-field[rix].r); e = max(e, field[rix].pos+field[rix].r); rix++; } } } } return fired; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; field.resize(n); set<int> results; for (unsigned int i = 0; i < n; ++i) { cin >> field[i].pos >> field[i].r; } for (unsigned int mask = 0; mask < 1u<<n; ++mask) { results.insert(explode(mask)); } cout << results.size() << "\n"; 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 72 73 74 75 76 77 78 79 80 81 82 83 84 | ///MEMENTO MEMO, MEMENTO LONG LONG #include <bits/stdc++.h> #define DEBUG if(0) #define COUT cout << "\e[36m" #define ENDL "\e[39m" << endl #define VAR(v) " [\e[32m" << #v << "\e[36m=\e[91m" << v << "\e[36m] " using namespace std; typedef long long LL; unsigned int n; struct Mine { LL pos, r; }; vector<Mine> field; string demask(unsigned int mask) { string out; for (int i = 0; i < n; ++i) { out += (char)((int)(bool)(mask&(1u<<i))+(int)'0'); } return out; } unsigned int explode(unsigned int mask) { unsigned int fired = 0; for (unsigned int i = 0; i < n; ++i) { if(mask&(1u<<i) && !(fired&(1u<<i))) { fired = fired|(1u<<i); LL b= field[i].pos-field[i].r; LL e= field[i].pos+field[i].r; int lix= i, rix = i; while((lix >= 0 && b <= field[lix].pos) || ((rix < n) && field[rix].pos <= e)) { if(lix >= 0 && b <= field[lix].pos) { fired = fired|(1u<<lix); b = min(b, field[lix].pos-field[lix].r); e = max(e, field[lix].pos+field[lix].r); lix--; } if(rix < n && field[rix].pos <= e) { fired = fired|(1u<<rix); b = min(b, field[rix].pos-field[rix].r); e = max(e, field[rix].pos+field[rix].r); rix++; } } } } return fired; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; field.resize(n); set<int> results; for (unsigned int i = 0; i < n; ++i) { cin >> field[i].pos >> field[i].r; } for (unsigned int mask = 0; mask < 1u<<n; ++mask) { results.insert(explode(mask)); } cout << results.size() << "\n"; return 0; } |