#include <iostream> #include <vector> typedef long long int ll; struct mine { int from; int to; std::vector<int> pos; bool vis=false; std::vector<int> links; bool should_link_to(const mine& other) const { for(int other_pos:other.pos) if(from<=other_pos&&other_pos<=to) return true; return false; } void merge_with(const mine& other) { for(int other_pos:other.pos) pos.push_back(other_pos); if(from>other.from) from=other.from; if(to<other.to) to=other.to; } }; int cnt; std::vector<mine> mines; void merge() { for(int i=0;i<(int)mines.size();++i) for(int j=0;j<(int)mines.size();) { if(i!=j) { if(mines[i].should_link_to(mines[j])&&mines[j].should_link_to(mines[i])) { mines[i].merge_with(mines[j]); mines[j]=mines.back(); mines.pop_back(); continue; } } ++j; } } void link() { for(int i=0;i<cnt;++i) for(int j=0;j<cnt;++j) if(i!=j) if(mines[i].should_link_to(mines[j])) mines[i].links.push_back(j); } int marked; void mark_rec(int i) { mine& m = mines[i]; m.vis=true; marked|=1<<i; for(int link:m.links) if(!mines[link].vis) mark_rec(link); } void mark(int mask) { marked=0; for(int i=0;i<cnt;++i) if((mask&(1<<i))&&!mines[i].vis) mark_rec(i); } void clear() { for(mine& m:mines) m.vis=false; } int main() { int n; std::cin>>n; for(int i=0;i<n;++i) { int p,r; std::cin>>p>>r; mine m; m.from=p-r; m.to=p+r; m.pos.push_back(p); mines.push_back(m); } merge(); cnt=mines.size(); link(); ll res=1; int range=1<<cnt; std::vector<bool> res_record(range+1,false); for(int i=1;i<range;++i) { mark(i); if(!res_record[marked]) { res_record[marked]=true; constexpr int c_limit=1000 * 1000 * 1000 + 7; if(++res==c_limit) res=0; } clear(); } std::cout<<res; 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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #include <iostream> #include <vector> typedef long long int ll; struct mine { int from; int to; std::vector<int> pos; bool vis=false; std::vector<int> links; bool should_link_to(const mine& other) const { for(int other_pos:other.pos) if(from<=other_pos&&other_pos<=to) return true; return false; } void merge_with(const mine& other) { for(int other_pos:other.pos) pos.push_back(other_pos); if(from>other.from) from=other.from; if(to<other.to) to=other.to; } }; int cnt; std::vector<mine> mines; void merge() { for(int i=0;i<(int)mines.size();++i) for(int j=0;j<(int)mines.size();) { if(i!=j) { if(mines[i].should_link_to(mines[j])&&mines[j].should_link_to(mines[i])) { mines[i].merge_with(mines[j]); mines[j]=mines.back(); mines.pop_back(); continue; } } ++j; } } void link() { for(int i=0;i<cnt;++i) for(int j=0;j<cnt;++j) if(i!=j) if(mines[i].should_link_to(mines[j])) mines[i].links.push_back(j); } int marked; void mark_rec(int i) { mine& m = mines[i]; m.vis=true; marked|=1<<i; for(int link:m.links) if(!mines[link].vis) mark_rec(link); } void mark(int mask) { marked=0; for(int i=0;i<cnt;++i) if((mask&(1<<i))&&!mines[i].vis) mark_rec(i); } void clear() { for(mine& m:mines) m.vis=false; } int main() { int n; std::cin>>n; for(int i=0;i<n;++i) { int p,r; std::cin>>p>>r; mine m; m.from=p-r; m.to=p+r; m.pos.push_back(p); mines.push_back(m); } merge(); cnt=mines.size(); link(); ll res=1; int range=1<<cnt; std::vector<bool> res_record(range+1,false); for(int i=1;i<range;++i) { mark(i); if(!res_record[marked]) { res_record[marked]=true; constexpr int c_limit=1000 * 1000 * 1000 + 7; if(++res==c_limit) res=0; } clear(); } std::cout<<res; return 0; } |