題目不再重述。
我也是看了解題報告的...之前怎麼都想不到,如果正常模擬的話,每一次插入元素都必須準確的知道位置在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...