洛谷 P1503 鬼子進村 Treap

2021-07-10 17:34:13 字數 1573 閱讀 3290

原題位址

題意就不解釋了吧。

看到這道題,一開始yy把所有點加進treap裡面,然後完全跟著操作走,應該是可做的。[在treap裡面找連續的一段應該很簡單,只要有一定**能力都行|||||||吧。。。。]

可不幸的因為本人太弱,不想寫,就不得不yy其它的做法,我們可以發現,被困士兵能通過的房子組成的序列的兩個端點為被毀滅的兩個房屋。[左端點有可能為零,即最左端,右端點可能為n+1,即最右端] 所以我們每次把被刪除的端點加入treap,對於查詢,我們查當前士兵的前驅和後繼即可

上** :

#include#include#include#include#include#include#includeconst int n = 5e4 + 7,inf = 0x7fffffff;

#define r121() ((rand()<<12)+(rand()<<7)+rand())

#include#define r233() (r121() % 456454541 + r121() % 452112101 + r121() % 121231 + 1)

using std :: bitset;

int n,m,v;

class treap

node (int data,node *fl) : data(data)

void update ()

}*null,*root,*pool,meme[n];

int ball;

void rotate (node *&t,bool v)

void insert (node *&t)

bool v = t -> data < ball;

insert (t -> son[v]);

if(t -> son[v] -> hr < t -> hr) rotate (t , v);

else t -> update(); }

void delete (node *&t)

bool v = t -> son[0] -> hr > t -> son[1] -> hr;

rotate (t , v);

delete (t -> son[v^1]);

} else

t -> update(); }

int subsequent (node *&t)

int precursor (node *&t)

public :

treap ()

void clear ()

void ins (int ***)

void del (int ***)

int sub (int ***)

int pre (int ***)

}treap;

char opt[n];

bitsetvis;

int stk[n],top;

int main ()

else if(opt[0] == 'q')

} }return 0;

}

that is all. thank you for watching!

洛谷 P1503 鬼子進村

描述 縣城裡有n個用地道相連的房子,第i個只與第i 1和第i 1個相連。這是有m個訊息依次傳來 1 訊息為d x 鬼子將x號房子摧毀了,地道被堵上。3 訊息為q x 有一名士兵被圍堵在x號房子中。李雲龍收到資訊很緊張,他想知道每乙個被圍堵的士兵能夠到達的房子有幾個。輸入格式 第一行2個整數n,m n...

洛谷P1503 鬼子進村 題解

原題 題目描述 縣城裡有 n nn 個用地道相連的房子,第 i ii 個只與第 i 1 i 1i 1 和第 i 1 i 1i 1 個相連。這時有 m mm 個訊息依次傳來 若訊息為 d x 鬼子將 x xx 號房子摧毀了,地道被堵上。若訊息為 q x 有一名士兵被圍堵在 x xx 號房子中。李雲龍收...

洛谷P1503 鬼子進村 平衡樹,STL

題目傳送門 描述 縣城裡有n個用地道相連的房子,第i個只與第i 1和第i 1個相連。這是有m個訊息依次傳來 1 訊息為d x 鬼子將x號房子摧毀了,地道被堵上。3 訊息為q x 有一名士兵被圍堵在x號房子中。李雲龍收到資訊很緊張,他想知道每乙個被圍堵的士兵能夠到達的房子有幾個。輸入格式 第一行2個整...