poj 2828 線段樹 單點插入,區間查詢

2021-06-08 16:10:03 字數 996 閱讀 3344

排隊買票,但是 中途 出現插隊情況,比如 0 123,代表值為123的人 插入到 0 的位置,如果後面 出現 0 456,那麼新的 0的位置就是 456,123就變成是 1的位置了

觀察發現,最後乙個插入到該位置的人位置是固定的,那麼我們可以從後面進行插入操作,pos val 代表val要插入到pos位置,那麼就是說 pos 前面要留出 pos個位置,

因為 是從 0 開始的。

線段樹 :res 記錄 該區間 目前還剩 res個空位,每一次 query即插入的時候 ,如果 該節點左兒子 res >=pos,那麼只要在左兒子找就可以了

否則 要在右兒子中 找 ,此時 pos 改為 pos-左兒子res。。

#include #include #include #define lson l , m , rt << 1

#define rson m + 1 , r , rt << 1 | 1

using namespace std;

const int maxn = 240000;

struct node

tree[maxn*4];

int p[maxn],val[maxn];

int n;

void builttree(int l,int r,int rt)

int ans[maxn];

void query(int rt,int pos,int val)

int m=(tree[rt].l+tree[rt].r)/2;

if(tree[rt*2].sum>=pos)

query(rt*2,pos,val);//左孩子可以容下則進左孩子

else

query(rt*2+1,pos-tree[rt*2].sum,val);//左孩子已滿

}int main()

for(int i=1;i<=n;i++)

printf("\n");

} return 0;

}

poj 2828 線段樹 單點更新

題意 有n個人排隊,每乙個人都有乙個val來對應,每乙個後來人都會插入當前隊伍的某乙個位置pos後面。要求把隊伍最後的狀態輸出。題解 一看到這種題目如果之前做過類似的題目很容易就可以想到要倒序完成 因為這樣每個數插入的位置在當前都是可以確定的,sum記錄當前線段的空位數 include includ...

poj2828 線段樹單點更新

題目意思 有n個人,乙個乙個的插到隊伍中去,要你求最後的隊伍。解題思路 最後乙個人想站在 就站在 所以最後乙個人的位置是固定。後面的根據前的可以確定位置。對於位置其實是前面已經有pos個人了,只是我們是逆排,所以是按空位排。排到空位子區間下標為pos的地方。include include defin...

POJ2828 線段樹逆序插入

題意 插隊的問題,每個樣例給出n,代表有n個插隊的,每個給出p,v,意思是代號為v的人插在了第p個人的後面,問最後的隊伍的排列?思路 最後乙個人的位置一定是確定的。依次倒著插入。include include include include pragma comment linker,stack 1...