using namespace std; #include <iostream> #include <vector> #include <utility> #include <map> struct mina { long long a,r; vector<int> blisk; //miny ktore sa w polu razenia }; map<int, bool> boom; vector<mina> miny; void chain(int a)//simulate a chain of booms { boom[a] = 1; for(int i=0; i<miny[a].blisk.size(); i++) { if(boom.count(miny[a].blisk[i]) == 0) { chain(miny[a].blisk[i]); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; for(int i=0; i<n; i++) { long long a,r; cin>>a>>r; mina M; M.a = a; M.r = r; miny.push_back(M); } for(int i=0; i<n; i++) { int sumd = - miny[i].a; for(int j=i+1; j<n; j++) { if(miny[i].r >= sumd + miny[j].a) { miny[i].blisk.push_back(j); } else { break; } } sumd = miny[i].a; for(int j=i-1; j>=0; j--) { if(miny[i].r >= sumd - miny[j].a) { miny[i].blisk.push_back(j); } else { break; } } } vector<map<int,bool> > zbiory; for(int i=0; i<n; i++) { boom.clear(); chain(i); zbiory.push_back(boom); } long long maxbit = 1<<n; map<map<int,bool>, bool> wszystkie; for(long long i=1; i<maxbit; i++) { long long k=1; map<int, bool> sboom; for(int j=0; j<n; j++) { if( i & k ) { sboom.insert(zbiory[j].begin(),zbiory[j].end()); } k<<=1; } wszystkie[sboom]=1; } cout<<wszystkie.size()+1; 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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | using namespace std; #include <iostream> #include <vector> #include <utility> #include <map> struct mina { long long a,r; vector<int> blisk; //miny ktore sa w polu razenia }; map<int, bool> boom; vector<mina> miny; void chain(int a)//simulate a chain of booms { boom[a] = 1; for(int i=0; i<miny[a].blisk.size(); i++) { if(boom.count(miny[a].blisk[i]) == 0) { chain(miny[a].blisk[i]); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; for(int i=0; i<n; i++) { long long a,r; cin>>a>>r; mina M; M.a = a; M.r = r; miny.push_back(M); } for(int i=0; i<n; i++) { int sumd = - miny[i].a; for(int j=i+1; j<n; j++) { if(miny[i].r >= sumd + miny[j].a) { miny[i].blisk.push_back(j); } else { break; } } sumd = miny[i].a; for(int j=i-1; j>=0; j--) { if(miny[i].r >= sumd - miny[j].a) { miny[i].blisk.push_back(j); } else { break; } } } vector<map<int,bool> > zbiory; for(int i=0; i<n; i++) { boom.clear(); chain(i); zbiory.push_back(boom); } long long maxbit = 1<<n; map<map<int,bool>, bool> wszystkie; for(long long i=1; i<maxbit; i++) { long long k=1; map<int, bool> sboom; for(int j=0; j<n; j++) { if( i & k ) { sboom.insert(zbiory[j].begin(),zbiory[j].end()); } k<<=1; } wszystkie[sboom]=1; } cout<<wszystkie.size()+1; return 0; } |