题目来源:
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; }