#include <bits/stdc++.h> using namespace std; typedef long long ll; #ifdef LOCAL #define debug(...) __VA_ARGS__ #else #define debug(...) {} #endif int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); debug(freopen("small11.in","r",stdin);); int i; int n; cin>>n; pair<ll,ll> tab[n]; for (i = 0; i < n; i++){ ll a,b; cin>>a>>b; tab[i] = {a,b}; } bool wy[(1<<n)]; for (i = 0; i < (1<<n); i++) wy[i] = 0; for (i = 0; i < (1<<n); i++){ bool vis[n]; for (int j = 0; j < n; j++) vis[j] = 0; for (int j = 0; j < n ; j++){ if (vis[j] || !(i&(1<<j))) continue; ll maksl = tab[j].first-tab[j].second; ll maksp = tab[j].first+tab[j].second; //cout<<"FOR "<<j<<" "<<maksl<<" "<<maksp<<"\n"; int l = j-1; int p = j+1; vis[j] = 1; while ((l > -1) || (p <= n)){ //if (l == -1) cout<<-2137<<" "; // else cout<<tab[l].first<<" "; //cout<<tab[p].first<<" "<<maksl<<" "<<maksp<<"\n"; if (l > -1){ if (vis[l] || tab[l].first < maksl){ if (p > n || tab[p].first > maksp) break; }else{ vis[l] = 1; maksl = min(maksl,tab[l].first-tab[l].second); maksp = max(maksp, tab[l].first+tab[l].second); l--; } } if (p <= n){ // cout<<p<<" "<<tab[p].first<<" "<<vis[p]<<"\n"; if (tab[p].first > maksp || vis[p]){ if (l < 0 || vis[l] || tab[l].first < maksl) break; }else{ vis[p] = 1; maksl = min(maksl,tab[p].first+tab[p].second); maksp = max(maksp, tab[p].first+tab[p].second); p++; } } } } int maskwy = 0; for (int j = 0; j < n; j++) if (vis[j]) maskwy += (1<<j); wy[maskwy] = 1; } int wynik = 0; for (i = 0; i < (1<<n); i++) if (wy[i]) wynik++; cout<<wynik<<"\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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; #ifdef LOCAL #define debug(...) __VA_ARGS__ #else #define debug(...) {} #endif int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); debug(freopen("small11.in","r",stdin);); int i; int n; cin>>n; pair<ll,ll> tab[n]; for (i = 0; i < n; i++){ ll a,b; cin>>a>>b; tab[i] = {a,b}; } bool wy[(1<<n)]; for (i = 0; i < (1<<n); i++) wy[i] = 0; for (i = 0; i < (1<<n); i++){ bool vis[n]; for (int j = 0; j < n; j++) vis[j] = 0; for (int j = 0; j < n ; j++){ if (vis[j] || !(i&(1<<j))) continue; ll maksl = tab[j].first-tab[j].second; ll maksp = tab[j].first+tab[j].second; //cout<<"FOR "<<j<<" "<<maksl<<" "<<maksp<<"\n"; int l = j-1; int p = j+1; vis[j] = 1; while ((l > -1) || (p <= n)){ //if (l == -1) cout<<-2137<<" "; // else cout<<tab[l].first<<" "; //cout<<tab[p].first<<" "<<maksl<<" "<<maksp<<"\n"; if (l > -1){ if (vis[l] || tab[l].first < maksl){ if (p > n || tab[p].first > maksp) break; }else{ vis[l] = 1; maksl = min(maksl,tab[l].first-tab[l].second); maksp = max(maksp, tab[l].first+tab[l].second); l--; } } if (p <= n){ // cout<<p<<" "<<tab[p].first<<" "<<vis[p]<<"\n"; if (tab[p].first > maksp || vis[p]){ if (l < 0 || vis[l] || tab[l].first < maksl) break; }else{ vis[p] = 1; maksl = min(maksl,tab[p].first+tab[p].second); maksp = max(maksp, tab[p].first+tab[p].second); p++; } } } } int maskwy = 0; for (int j = 0; j < n; j++) if (vis[j]) maskwy += (1<<j); wy[maskwy] = 1; } int wynik = 0; for (i = 0; i < (1<<n); i++) if (wy[i]) wynik++; cout<<wynik<<"\n"; return 0; } |