POJ-2828-Buy Tickets
阿新 • • 發佈:2019-04-09
tick istream 排隊 memory 狀態 ack segment mem 就是
鏈接:https://vjudge.net/problem/POJ-2828#author=0
題意:
有N個人排隊,每一個人都有一個val來對應,每一個後來人都會插入當前隊伍的某一個位置pos。要求把隊伍最後的狀態輸出。
思路:
剛開始想不到線段樹,看了題解之後還是有點懵。
就是線段樹的單點更新。
代碼:
#include <iostream> #include <memory.h> #include <string> #include <istream> #include <sstream> #include <vector> #include <stack> #include <algorithm> #include <map> #include <queue> #include <math.h> #include <cstdio> using namespace std; typedef long long LL; const int MAXN = 2e5 + 10; int segment[MAXN*4]; int a[MAXN], b[MAXN]; int res[MAXN]; void Push_up(int root) { segment[root] = segment[root<<1] + segment[root<<1|1]; } void Build(int root, int l, int r) { if (l == r) { segment[root] = 1; return; } int mid = (l+r)/2; Build(root<<1, l, mid); Build(root<<1|1, mid+1, r); Push_up(root); } void Update(int root, int l, int r, int pos, int val) { if (l == r) { res[l] = val; segment[root] = 0; return; } int mid = (l+r)/2; if (segment[root<<1] >= pos) Update(root<<1, l, mid, pos, val); else Update(root<<1|1, mid+1, r, pos-segment[root<<1], val); Push_up(root); } int main() { int n; while (~scanf("%d", &n)) { Build(1, 1, n); for (int i = 1;i <= n;i++) scanf("%d%d", &a[i], &b[i]); for (int i = n;i >= 1;i--) Update(1, 1, n, a[i]+1, b[i]); for (int i = 1;i <= n;i++) cout << res[i] << ‘ ‘ ; cout << endl; } return 0; }
POJ-2828-Buy Tickets