題目連結:
題目大意:
給定兩正整數 N ( 1 ≦ N ≦ 200, 000 )、 Q ( 1 ≦ Q ≦ 200, 000 )。表示一開始有N個函數,且全部都是遞增的函數。像是F(X),當X越大,F(X)之值越大,則F(X)就是一個遞增的函數;反之,則是一個遞減函數。
而現有 Q 行,每行第一個數字為 V 。
如果 V = 1 ,則接下來有一正整數 i ,代表第 i 個函數的增減性要反過來(增函數變成減函數、減函數變增函數)。
若 V = 2 ,則會接著兩正整數 L 、 R ( 1 ≦ L ≦ R ≦ N ),求:
上述值的增減性(也就是把上述式子看作一個新函數),其中 FL 代表第 L 個函數,以此類推。遞增則輸出「0」;反之,輸出「1」。
範例輸入:
5 3
2 2 4
1 3
2 2 4
範例輸出:
0
1
解題思維:
首先,我們觀察只有 3 個函數的時候:
一開始都是增函數,所以 F1(F2(F3(X))) 當然也是增函數。
而現在我們把第2個函數翻轉增減性,因此 F2(F3(X)) 變成了一個遞減函數,所以 F1(F2(F3(X))) 也變成了一個遞減函數。
而再把第3個函數翻轉,因此 F2(F3(X)) 變回了一個遞增函數,而 F1(F2(F3(X))) 也變回了增函數。
以上我們可以發現:如果把增函數當作1,減函數當作-1。則
的增減性即為各個函數增減性所代表的數字之乘積。像是上面的例子, F1(F2(F3(X))) 之增減性 = 1* (-1) * (-1)= 1 ,因此是遞增的函數。
但是因為 N 、 Q 可以高達 200, 000 ,而如果我們每次詢問增減性的時候就要用迴圈去跑一次乘積,最糟的時間複雜度為 O(NQ) ,然而時間限制為 1 秒。
就算使用前綴預處理的概念,在更新函數的增減性之時,最糟要從 1 跑到 N 。因此最糟的時間複雜度仍然是 O(NQ) 。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。