#include<bits/stdc++.h> using namespace std; long long a[300010]; long long r[300010]; long long w[2000010]; long long u[300010]; long long odw[3000010]; queue<int> kolejka; int main() { int n, i; long long ulozenie, j; scanf("%d", &n); for(i=1;i<=n;i++) { scanf("%lld%lld", &a[i], &r[i]); odw[i] =-1; } ulozenie = 0; while(ulozenie<(1<<n)) { j=ulozenie; for(i=1;i<=n;i++) { u[i] = j%2; if(j%2 == 1) { odw[i] = ulozenie; kolejka.push(i); } j/=2; } while(kolejka.size()>0) { int x = kolejka.front(); kolejka.pop(); int y=x; while(true) { y--; if(y==0 || a[y]<a[x]-r[x]) break; if(odw[y]!=ulozenie) { odw[y] = ulozenie; kolejka.push(y); } } y=x; while(true) { y++; if(y==n+1 || a[y]>a[x]+r[x]) break; if(odw[y]!=ulozenie) { odw[y] = ulozenie; kolejka.push(y); } } } for(i=1;i<=n;i++) { if(odw[i] == ulozenie) w[ulozenie]++; w[ulozenie]*=2; } ulozenie++; } sort(w, w+(1<<n)); long long wynik=1; for(i=1;i<(1<<n);i++) if(w[i] !=w[i-1]) wynik++; printf("%lld", (wynik%1000000007)); }
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 | #include<bits/stdc++.h> using namespace std; long long a[300010]; long long r[300010]; long long w[2000010]; long long u[300010]; long long odw[3000010]; queue<int> kolejka; int main() { int n, i; long long ulozenie, j; scanf("%d", &n); for(i=1;i<=n;i++) { scanf("%lld%lld", &a[i], &r[i]); odw[i] =-1; } ulozenie = 0; while(ulozenie<(1<<n)) { j=ulozenie; for(i=1;i<=n;i++) { u[i] = j%2; if(j%2 == 1) { odw[i] = ulozenie; kolejka.push(i); } j/=2; } while(kolejka.size()>0) { int x = kolejka.front(); kolejka.pop(); int y=x; while(true) { y--; if(y==0 || a[y]<a[x]-r[x]) break; if(odw[y]!=ulozenie) { odw[y] = ulozenie; kolejka.push(y); } } y=x; while(true) { y++; if(y==n+1 || a[y]>a[x]+r[x]) break; if(odw[y]!=ulozenie) { odw[y] = ulozenie; kolejka.push(y); } } } for(i=1;i<=n;i++) { if(odw[i] == ulozenie) w[ulozenie]++; w[ulozenie]*=2; } ulozenie++; } sort(w, w+(1<<n)); long long wynik=1; for(i=1;i<(1<<n);i++) if(w[i] !=w[i-1]) wynik++; printf("%lld", (wynik%1000000007)); } |