#include<bits/stdc++.h> using namespace std; struct para { long long a,b; }; void wypisz(int mask) { while(mask>=0) { cout << mask%2; mask/=2; if(mask==0) break; } cout <<endl; } int main() { ios_base::sync_with_stdio(0); int n; cin >> n; vector<para> vec(n); for(int k=0;k<n;k++) cin >> vec[k].a >> vec[k].b; map<int,bool> mapa; int ile = 0; for(int k=0;k<(1 << n);k++) { // cout << "rozwazam "; // wypisz(k); int mask = 0; for(int i=0;i<n;i++) { if(k & (1 << i)) { long long min_l = vec[i].a-vec[i].b; long long max_r = vec[i].a + vec[i].b; mask = mask | (1<<i); int l = i-1; while(l >=0 && min_l <= vec[l].a) { mask = mask | (1<<l); min_l = min(min_l,vec[l].a - vec[l].b); max_r = max(max_r,vec[l].a + vec[l].b); l--; } int r = i+1; while(r < n && max_r>= vec[r].a) { mask = mask | (1<<r); max_r = max(max_r,vec[r].a + vec[r].b); min_l = min(min_l,vec[r].a - vec[r].b); r++; while(l >=0 && min_l <= vec[l].a) { mask = mask | (1<<l); min_l = min(min_l,vec[l].a - vec[l].b); max_r = max(max_r,vec[l].a+ vec[l].b); l--; } } } } if(!mapa[mask]) { ile++; // wypisz(mask); } mapa[mask]= true; } cout << ile<<endl; }
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 | #include<bits/stdc++.h> using namespace std; struct para { long long a,b; }; void wypisz(int mask) { while(mask>=0) { cout << mask%2; mask/=2; if(mask==0) break; } cout <<endl; } int main() { ios_base::sync_with_stdio(0); int n; cin >> n; vector<para> vec(n); for(int k=0;k<n;k++) cin >> vec[k].a >> vec[k].b; map<int,bool> mapa; int ile = 0; for(int k=0;k<(1 << n);k++) { // cout << "rozwazam "; // wypisz(k); int mask = 0; for(int i=0;i<n;i++) { if(k & (1 << i)) { long long min_l = vec[i].a-vec[i].b; long long max_r = vec[i].a + vec[i].b; mask = mask | (1<<i); int l = i-1; while(l >=0 && min_l <= vec[l].a) { mask = mask | (1<<l); min_l = min(min_l,vec[l].a - vec[l].b); max_r = max(max_r,vec[l].a + vec[l].b); l--; } int r = i+1; while(r < n && max_r>= vec[r].a) { mask = mask | (1<<r); max_r = max(max_r,vec[r].a + vec[r].b); min_l = min(min_l,vec[r].a - vec[r].b); r++; while(l >=0 && min_l <= vec[l].a) { mask = mask | (1<<l); min_l = min(min_l,vec[l].a - vec[l].b); max_r = max(max_r,vec[l].a+ vec[l].b); l--; } } } } if(!mapa[mask]) { ile++; // wypisz(mask); } mapa[mask]= true; } cout << ile<<endl; } |