POJ 2828解題報告

2021-06-08 12:38:36 字數 1275 閱讀 6845

題目不再重述。

我也是看了解題報告的...之前怎麼都想不到,如果正常模擬的話,每一次插入元素都必須準確的知道位置在pos的元素究竟是哪乙個,知道連在那乙個元素後面,才能正確的串成乙個隊嘛。。

如果用陣列-- 向中間加元素要乙個乙個的挪

用鍊錶--n^2   超時了。。

其他的資料結構?怎麼都想不到一種可以動態維護記錄每個元素(相對整個佇列)絕對位置的 可insert 結構...

這時候就需要找規律了:加入0 1,0  2

後面來的2會把1擠掉,這是不是說後面的元素「更優先」一些呢?繼續想下去,發現:最後乙個元素插入的位置總是它最終的絕對位置!!

然後?--那倒數第二呢?它插入的位置似乎沒啥規律,可是去掉已經固定位置的元素在看呢?

這時需要乙個可以動態數出前面有幾個空位的東西了--我用的是樹狀陣列。

#include"stdio.h"

#include"stdlib.h"

#include"time.h"

#include"math.h"

#include"iostream"

#include"string.h"

#include"algorithm"

#include"vector"

#include"string"

#include"queue"

#include"map"

#define nmax 2001000

#define inf 0x7ffffff

#define eps 1e-8

#define pi 3.1415926535

#define prime 9999991

using namespace std;

int n;

int ans[nmax];

struct peoplepeo[nmax];

//int pi[nmax],vi[nmax];

#define lowbit(x) (x)&(x^(x-1))

//int a[21];

int c[nmax];

void change(int k,int del)

return ;

}int get_num(int k)

return z;

}int get_ans(int x,int y)

int get_pos(int v)

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

puts("");

}return 0;}

線段數應用 poj2828

線段數應用 題目 buy tickets 題目大意 n個人排隊等待,第 i個人到來會有兩個資訊 pos i 0,i 1 val i 表明這 個人會插隊到 pos i 的後邊,這個人的值是 val i 依次給出 n個人的到來資訊,輸出最終的 佇列從頭到尾每個人的值。思路 第 i個人插入的位置是 pos...

poj2828 無鍵跳表

所以我覺得這個題吧,其實正解是個跳表。1.首先我們不考慮跳表,考慮二叉搜尋樹。如果這個題用二叉搜尋樹,怎麼做呢?考慮一下啊。首先很容易知道每個人名字和點的鍵值key是沒關係的對吧。那麼人的名字就只能作為value了對吧。那我們需要個key。那麼,key要保證什麼條件呢?很明顯每次插進去乙個點q,插在...

線段樹典型例題 poj2828

逆序處理。注意到如果逆序插入,則每次插入的位置都是第x個空位。所以可以用線段樹來尋找第x個合法位置 include include include include include using namespace std const int n 200005 int sum n 3 pos n val...