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; } |
English