[POJ2828] 티켓 구매

우리는 일찍 일어나 긴 대기열에 가입해야하므로 철도 티켓은, 중국의 음력 새해의 주위에 살 어려운 ...

설날이 다가오고 있지만, 불행하게도 작은 고양이가 여전히 있었다 스케줄이 여기에 가서. 이제 그는 정보학 올림픽 대표팀의 겨울 캠프 선택을위한 면양, 쓰촨성에 기차로 여행했다.

그것은 하나의시 오전과 어두운 외부이었다. 큐에있는 사람들을 놀라게하지 않았다 북서쪽에서 바람 침착 해. 차가운 밤 작은 고양이에게 전율을 주었다. 이유에 대해 생각하는 문제를 찾을 수 없습니다? 즉 죽음에 동결보다 덜 더 나은 아무것도 없었다!

사람들은 큐를 점프 유지. 이 주변에 너무 어두웠 때문에, 이러한 움직임은 심지어 큐 점퍼 옆에있는 사람들에 의해 발견되지 않을 것이다. "그들이 큐 - 점프가 주어진 후 어디에 서 큐에있는 모든 사람이 정수 값과 대기열을 뛰어 사람들에 대한 모든 정보를 할당하는 경우, 나는 큐에있는 사람들의 마지막 순서를 찾을 수 있습니까?"생각을 작은 고양이.

입력은
입력에서 여러 테스트 케이스가 될 것입니다. 각 시험은 N (1 ≤ N ≤ 20)는 테스트 케이스의 첫 번째 줄에 제시되어 N + 1 개 라인들로 구성된다. 다음 N 라인 I의 증가하는 순서 (1 ≤ N ≤ I)의 값과 포지 VALI의 쌍을 포함한다. 다음 각 I 들어, 범위 및 포지 및 VALI의 의미는 이하와 같다 :

포지는 ∈ [0, 난 - 1] - i 번째 사람은 큐에 와서 바로 큐의 포지 번째 사람의 뒤에 서 있었다. 예약 사무실은 큐의 최초의 사람으로 간주 된 큐의 선두에 0 번째 사람과 사람으로 간주되었다.
VALI ∈ [0, 32767] - i 번째 사람 VALI 값이 할당되었다.
이 테스트 케이스 사이에 빈 줄. 입력의 끝으로 이동합니다.

출력
각 테스트 케이스의 경우, 출력 그들이 큐에 서 순서에있는 사람들의 값입니다 공백으로 구분 된 정수의 한 줄.

샘플 입력
4
0 77
1 51
1 33
2 69
4
0 20,523
1 19,243
1 3890
0 31,492
샘플 출력
(77) 33 (69) 51
31,492 20,523 3,890 19,243
힌트
기재된 작은 고양이 큐에있는 사람들의 최종 순서를 발견하는 방법을 보여주는 아래 그림 입력 샘플의 첫 번째 테스트 케이스이다.

아 ...
의 아주 오래된 문제
질문의 의미는 기본적으로 모든 넌센스
무엇 단어 번역
사람들의 무리는 처음에 삽입되는, 지금은 비어있는 큐가 있습니다 나는 나는 개인적 먼저 삽입 될 에스 나는 pos_i 개별 뒤에, 각 사람을 가지고 있습니다 V 나는 val_i 이제 삽입의 마지막 소유자 후 당신에게 출력 큐를하자 V

생각 첫 번째 I에 목록이 삽입 위치가 너무 쉽게 얻지 못하고 있음을 발견했다
우리가 무엇에 문제에 대한 우리의 두뇌를 사용하기 위해 필요한이 시간 그래서
우리는 순서대로 큐를 이동하면 우리가 어디 악화로 알고 있지만하지 않을 때 우리는 플러그인입니다 결국, 그는 때마다 우리가 발로 위치를 결정 있도록, 발로 시작

우리는 무엇을 사용하여 알아?

우리는 유지하기 위해 트리 라인을 사용할 수 있습니다
, 그 위치에서 1 번 이상 사람이 할 모든 킥 트리 선으로 유지 공석의 수를
한 후 사라가
(코드 이해 참조)

# include <cstdio>
# include <algorithm>
# include <cstring>
# include <cmath>
# include <climits>
# include <iostream>
# include <string>
# include <queue>
# include <stack>
# include <vector>
# include <set>
# include <map>
# include <cstdlib>
# include <ctime>
using namespace std;

# define Rep(i,a,b) for(int i=a;i<=b;i++)
# define _Rep(i,a,b) for(int i=a;i>=b;i--)
# define RepG(i,u) for(int i=head[u];~i;i=e[i].next)

typedef long long ll;
const int N=2e5+5;
const int inf=0x7fffffff;
const double eps=1e-7;
template <typename T> void read(T &x){
	x=0;int f=1;
	char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
	for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
	x*=f;
}

int n,ans[N<<2];
int pos[N],val[N];

struct segment_tree{
	int l,r,val;	
}seg[N<<2];

# define lc (u<<1)
# define rc (u<<1|1)

void build(int u,int l,int r){
	seg[u].l=l,seg[u].r=r;	
	seg[u].val=r-l+1;
	if(l==r)return;
	int mid=l+r>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
}

void insert(int u,int pos,int k){
	if(seg[u].l==seg[u].r){seg[u].val--,ans[u]=k;return;}
	if(pos<=seg[lc].val)insert(lc,pos,k);
	else insert(rc,pos-seg[lc].val,k);
	seg[u].val=seg[lc].val+seg[rc].val;
}

void dfs(int u){
	if(seg[u].l==seg[u].r){printf("%d ",ans[u]);return;}
	dfs(lc);
	dfs(rc);	
}

int main()
{
	while(~scanf("%d",&n)){
		build(1,1,n);
		Rep(i,1,n)read(pos[i]),read(val[i]);
		_Rep(i,n,1)insert(1,pos[i]+1,val[i]);
		dfs(1);
		printf("\n"); 
	}
	return 0;
}
게시 18 개 원래 기사 · 원의 찬양 3 · 조회수 1255

추천

출처blog.csdn.net/devout_/article/details/104077024