洛谷P1503 鬼子進村 題解

2021-10-22 03:47:10 字數 1578 閱讀 3541

原題

題目描述

縣城裡有 n

nn 個用地道相連的房子,第 i

ii 個只與第 i−1

i−1i−

1 和第 i+1

i+1i+

1 個相連。

這時有 m

mm 個訊息依次傳來:

若訊息為 d x:鬼子將 x

xx 號房子摧毀了,地道被堵上。

若訊息為 q x:有一名士兵被圍堵在 x

xx 號房子中。

李雲龍收到資訊很緊張,他想知道每乙個被圍堵的士兵能夠到達的房子有幾個。

輸入格式

第一行兩個整數 n,m。

接下來 m 行,有如題目所說的三種資訊共 m 條。

輸出格式

對於每乙個被圍堵的士兵,輸出該士兵能夠到達的房子數。

房子是一條鏈

刪除的房子先毀後建

就是說已毀掉的房子的位置集合是個棧

查詢時要輸出的是兩側最近的已毀房屋的距離差減一

就可以用個平衡樹放在已毀房屋的位置集合上

減小查前驅字尾的複雜度

#include

#include

#include

#define inf 0x3fffffff

using

namespace std;

struct nodenode[

100039];

char opt;

bool bb[

50004];

int k,root,n,m,x,de[

50004

],t;

intmax

(int a,

int b)

intmin

(int a,

int b)

void

pushup

(int p)

intnewnode

(int x)

void

zag(

int&p)

void

zig(

int&p)

void

insert

(int

&p,int x)

else

pushup

(p);

}void

erase

(int

&p,int x)

}else

if(node[p]

.val>x)

erase

(node[p]

.l,x)

;else

erase

(node[p]

.r,x)

;pushup

(p);

}int

get_pre

(int p,

int x)

intget_nex

(int p,

int x)

intmain()

if(opt==

'r')

if(opt==

'q')

}return0;

}

洛谷 P1503 鬼子進村

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

洛谷 P1503 鬼子進村 Treap

原題位址 題意就不解釋了吧。看到這道題,一開始yy把所有點加進treap裡面,然後完全跟著操作走,應該是可做的。在treap裡面找連續的一段應該很簡單,只要有一定 能力都行 吧。可不幸的因為本人太弱,不想寫,就不得不yy其它的做法,我們可以發現,被困士兵能通過的房子組成的序列的兩個端點為被毀滅的兩個...

洛谷 1503 鬼子進村 題解

部落格觀賞效果更佳 給定乙個長度為n 5 e4 n 5e4 n 5 e4 的01 0101 序列,一開始都是1 11。支援三種操作 修改某乙個位置為0 00撤銷上一次修改 詢問包含某個位置的最長的連續的1 11的個數。m ul tise tmultiset multis et維護位置,二分得到左右,...