description
小明是乙個非常浪漫的畫家,他喜歡畫各種奇奇怪怪的畫,雖然沒人理解他畫的究竟是什麼東西。input有一天,他突發奇想,對於一根木條,他每次從木條中選取乙個區間[l,r]進行染色,經過多次染色後,他想知道在[a,b]區間中有幾個未被染色的子區間?
可惜小明雖然畫畫非常厲害,但是並不擅長解決這類問題,於是,他拿著這根木條來找你,希望你能夠給他幫助。
假設木條無限長,所有查詢都在木條長度範圍內,未被染色的子區間是指,木條上染過色的區間的間斷部分。
第一行乙個整數t,代表資料組數。對於每組資料,第一行給出兩個整數n,q,分別代表染色的區間個數,以及查詢個數。
之後n行,每行兩個整數l,r,表示將l到r的區間進行染色,包含l,r兩個節點。
之後q行,每行兩個整數a,b,表示詢問a到b總共有多少未被染色的子區間。
兩組資料之間用乙個空行隔開。
t<20
n<10000
q<100000
0<=l0<=a<=b<1000000
output
對於每次詢問,輸出乙個整數,表示查詢結果。sample input每組資料之後,請輸出乙個空行。
2sample output2 31 2
3 41 3
3 45 5
3 31 5
2 85 6
0 50 9
9 9
101hint121
題解:對於第一組資料,[0,1),(2,3),(4,+)是未染色的子區間,因此查詢[1,3]可以找到(2,3)這個子區間,而對於[3,4]不能找到,對於[5,5]可以找到[5,5]。
對於第二組資料,[0,1)和(8,+)是未染色的子區間,因此對於[0,5]只有子區間[0,1),對於查詢[0,9],有子區間[0,1)和(8,9],對於查詢[9,9],有[9,9]這個子區間。
題目比較簡單,一般的區間更新+離散化,主要題意很迷,區間[1,1]當做乙個點,[1,2]也當做乙個點,看洋少的寫法換了種離散化的方法結果調bug調半天
**:
1 #include2using
namespace
std;
3#define inf 0x3f3f3f3f
4#define m(a, b) memset(a, b, sizeof(a))
5#define lson o<<1
6#define rson o<<1|1
7const
int n = 100000 + 5;8
int hash[1000005], val[1000005
], a[n], l[n], r[n], ql, qr, tot, num;910
void build(int o, int l, int
r) 17
18void pushup(int
o) 22
23void pushdown(int
o) 26
27void update(int o, int l, int
r) 31
else38}
3940
int query(int o, int l, int
r) 48
49void gethash(int
n) 56 num = 1;57
for (int i = 0; i <= a[2*n-1]+2; ++i)
58if (hash[i]) num = hash[i] + 1;59
else hash[i] =num; 60}
6162
intmain()
72gethash(n);
73 build(1, 1
, num);
74int
l, r;
75for (int i = 0; i < n; ++i)
79for (int i = 0; i < q; ++i)
85if (t) printf("\n"
);86}87
88return0;
89 }
2016安徽省賽 木條染色 離散化 線段樹
水模板題當時腦袋短路連想都沒想啊!補題的時候居然因為乙個條件打錯超時好幾發,太弱太傻比了 離散化敲了很長時間還是要加油啊 include include include using namespace std define lson i 1 define rson i 1 1 int maxn,t,...
線段樹 離散化 染色
這個題目太坑了,一直給報超時,然後調了一下午發現多開了乙個map。ac include include include include include include include includeusing namespace std define maxn 10000000 100 define...
Foreign 染色 LCT 線段樹
詢問x到根路徑上不同顏色的個數,支援將x到根的路徑上的點全部設為新的顏色。我們將邊兩端的點顏色相同的邊設為實邊,不同的設為虛邊。那麼一次新增顏色的操作顯然就是lct的access操作!access的時候恰是虛邊和實邊的轉換。那麼我們只要用線段樹維護每個點到根的貢獻,結合dfs序來實現子樹加,每次在l...