#include<bits/stdc++.h>
using namespace std;
pair <long long,long long> arr[300000+69];
map <long long,int> mapa;
int range_left[300000+69];
int range_right[300000+69];
bool vl[10000000+69];
bool visited[300000+69];;
queue <int> q;
int det(int l,int n){
int v,i,r;
for(i=0;i<n;i++){
visited[i]=false;
if(l%2)
q.push(i);
l/=2;
}
while(!q.empty()){
v=q.front();
q.pop();
if(visited[v])
continue;
visited[v]=true;
for(i=v-1;i>=range_left[v];i--)
if(!visited[i])
q.push(i);
for(i=v+1;i<=range_right[v];i++)
if(!visited[i])
q.push(i);
}
r=0;
for(i=n-1;i>=0;i--)
r=r*2+(int)visited[i];
//printf("%d\n",r);
return r;
}
int main(){
int n,i,m,j,p,result,pom;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%lld%lld",&arr[i].first,&arr[i].second);
mapa[arr[i].first]=i;
}
for(i=0;i<n;i++)
range_left[i]=range_right[i]=i;
for(i=1;i<n;i++)
range_left[i]=range_left[(mapa.lower_bound(arr[i].first-arr[i].second)->second)];
for(i=n-2;i>=0;i--)
range_right[i]=range_right[(--mapa.upper_bound(arr[i].first+arr[i].second))->second];
p=1;
for(i=0;i<n;i++)
p*=2;
result=0;
for(i=0;i<p;i++){
pom=det(i,n);
if(!vl[pom]){
result++;
vl[pom]=true;
}
}
printf("%d\n",result);
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 | #include<bits/stdc++.h> using namespace std; pair <long long,long long> arr[300000+69]; map <long long,int> mapa; int range_left[300000+69]; int range_right[300000+69]; bool vl[10000000+69]; bool visited[300000+69];; queue <int> q; int det(int l,int n){ int v,i,r; for(i=0;i<n;i++){ visited[i]=false; if(l%2) q.push(i); l/=2; } while(!q.empty()){ v=q.front(); q.pop(); if(visited[v]) continue; visited[v]=true; for(i=v-1;i>=range_left[v];i--) if(!visited[i]) q.push(i); for(i=v+1;i<=range_right[v];i++) if(!visited[i]) q.push(i); } r=0; for(i=n-1;i>=0;i--) r=r*2+(int)visited[i]; //printf("%d\n",r); return r; } int main(){ int n,i,m,j,p,result,pom; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%lld%lld",&arr[i].first,&arr[i].second); mapa[arr[i].first]=i; } for(i=0;i<n;i++) range_left[i]=range_right[i]=i; for(i=1;i<n;i++) range_left[i]=range_left[(mapa.lower_bound(arr[i].first-arr[i].second)->second)]; for(i=n-2;i>=0;i--) range_right[i]=range_right[(--mapa.upper_bound(arr[i].first+arr[i].second))->second]; p=1; for(i=0;i<n;i++) p*=2; result=0; for(i=0;i<p;i++){ pom=det(i,n); if(!vl[pom]){ result++; vl[pom]=true; } } printf("%d\n",result); return 0; } |
English