题目来源:

http://acm.fzu.edu.cn/problem.php?pid=2163

 

代码如下:

 

using namespace std ;
typedef long long LL ;
const int Max_N = 100005;
struct Elem{
    int x,h,id,index;
    bool operator<(const Elem&  p)const{
        return x<p.x;
    }
};
Elem data[Max_N], st[Max_N];
int ans[Max_N];
int top,n;
void Init(){
    for(int i=1; i <= n; i++){
        scanf("%d%d",&data[i].x,&data[i].h);
        data[i].id=i;
    }
    sort(data+1, data+n+1);
}
//单调栈 写法 与凸包模板差不多
void solve(){
    int N=n+1;
    data[N].x=1<<30;
    for(int i=1; i<= N ; i++)
        data[i].index=i;
    st[1]=data[1];
    top=1;
    for(int i = 2; i<=N; i++){
        while(top>=1 && st[top].x + st[top].h - 1 < data[i].x){
            ans[st[top].id ]=  data[i].index - st[top].index ;
           // printf("ans[%d]=%d\n",st[top].id , ans[st[top].id ]);
            top--;
        }
        st[++top]= data[i];
    }
}
int main(){
    while(scanf("%d",&n) != EOF){
        Init();
        solve();
        printf("%d",ans[1]);
        for(int i=2; i<=n ; i++){
            printf(" %d",ans[i]);
        }
        puts("");
    }
    return 0;
}