도미 노

Problem Description
Vasya         。              ,              。       , n               。             ,           。 i          xi   hi。  Vasya    ,                 ,                。
   ,       ,                ,        。    ,       (    x   h)  ,      [ X + 1,x + H - 1]           。
Input
         ,       。
             n(1≤N≤10^5),          。  n ,        xi hi(-10^8≤xi≤10^8 ,2 ≤hi≤108),xi           hi          。                 。
Output
          ,  n       Zi -             ,  Vasya  i      (         )。
Sample Input
4
16 5
20 5
10 10
18 2
3
6 7
2 9
-6 10
Sample Output
3 1 4 1
1 2 3
//   :    。
//  :
#include
#include
#include
#include
#include
using namespace std;
const int c = 100010;
struct node
{
	__int64 x;
	int h;
	int len;
	int i;
}p[c];
int dp[c];
bool cmp(node nd1,node nd2)
{
	return nd1.x < nd2.x;
}
void fun(int n)
{
	node nd;
	stack st;
	st.push(p[1]);
	for(int i = 2; i <= n; i ++)
	{
		while(!st.empty() && (st.top().x + st.top().h -1) < p[i].x)
		{
			nd = st.top();
			st.pop();
			dp[nd.i] = p[i].len - nd.len;
		}
		st.push(p[i]);
	}
}
int main()
{
// 	freopen("a.txt","r",stdin);
        int n, i, j;
	while(scanf("%d",&n)!=EOF)
	{
		for(i = 1; i <= n; i ++)
		{
			scanf("%I64d%d",&p[i].x,&p[i].h);
		    p[i].i = i;
		}
                n ++;
		p[n].x = (1 << 30);
		sort(p+1,p+1+n,cmp);
		for(i = 1; i <= n; i ++)
			p[i].len = i;
		fun(n);
		for(i = 1; i < n; i ++)
		{
			if(i != 1) printf(" ");
			printf("%d",dp[i]);
		}
		printf("
"); } return 0; }

좋은 웹페이지 즐겨찾기