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