链接: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; }