现在的位置: 首页 > 综合 > 正文

POJ 2828 Buy Tickets

2019年04月09日 ⁄ 综合 ⁄ 共 752字 ⁄ 字号 评论关闭

大意略。

思路:倒序插入,表示从左往右数,第i个区间有多少个空位置,于是找到了最终的坐标。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

const int MAXN = 200010;

int n, id;
int Tree[MAXN<<2];
int pos[MAXN], val[MAXN];
int ans[MAXN];

void build(int o, int L, int R)
{
	int M = L+(R-L)/2;
	Tree[o] = R-L+1;
	if(L == R) return ;
	build(o*2, L, M);
	build(o*2+1, M+1, R);
}

void update(int p, int o, int L, int R)
{
	int M = L+(R-L)/2;
	Tree[o]--;
	if(L == R) id = L;
	else
	{
		if(p <= Tree[o*2]) update(p, o*2, L, M);
		else
		{
			p -= Tree[o*2];
			update(p, o*2+1, M+1, R);
		}
	}
}

void read_case()
{
	build(1, 1, n);
	for(int i = 1; i <= n; i++) scanf("%d%d", &pos[i], &val[i]);
	for(int i = n; i >= 1; i--)
	{
		update(pos[i]+1, 1, 1, n);
		ans[id] = val[i];
	}
}

void solve()
{
	read_case();
	for(int i = 1; i <= n; i++) printf(i != n? "%d ":"%d\n", ans[i]);
}

int main()
{
	while(~scanf("%d", &n))
	{
		solve();
	}
	return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.