//(╯‵□′)╯︵┻━┻ 題目描述 Description
HeRaNO喜歡追番,他每天晚上都要看番,看到吐槽的地方,他就會掀桌子…… 一天晚上,HeRaNO又看番了。他覺得自己會掀桌子,于是他將他的桌子圍成一個圈,看到一個槽點,他就會以順時針方向將L號和R號(包括L號和R號)之間的桌子掀翻。如果這個桌子已經翻了,他就會再翻回來…… 這部番太爛了,HeRaNO掀了很多次桌子,在一旁的HSD桑看不下去了,他將HeRaNO每次掀翻桌子的區間[L,R]記錄了下來,準備把桌子復原,他知道最后所有桌子的情況,請求出最初桌子的情況。(0-掀翻,1-沒掀翻)
輸入 Input
第1行,兩個正整數n,T。n表示桌子數,T表示HeRaNO掀了T次桌子; 第2行,n個數,表示桌子的最后狀態。 第3~T+2行,每行兩個整數L,R,表示掀翻桌子的區間。 為了方便讀入輸出,操作的第i行為HeRaNO的第T?i+1步操作。
輸出 Output
一行n個數,用空格分隔,表示最初的桌子情況。
樣例輸入 Sample Input
8 2 1 0 1 0 1 1 0 0 4 5 5 4
樣例輸出 Sample Output
0 1 0 0 1 0 1 1
樣例解釋 Explanation
第二次HeRaNO掀翻的是[4,5]區間的桌子,HSD桑要翻回來,序列變成: 1 0 1 1 0 1 0 0; 第一次HeRaNO掀翻[5,4]區間的桌子,序列變成: 0 1 0 0 1 0 1 1。 (此處用“[]”是不合理的……)
限制 Limits
30%的數據:n,T≤103; 70%的數據:n,T≤105; 100%的數據:n,T≤106。 Time Limit:3s & Memory Limit:512MB
題解 Solution 30%的數據:送分,暴力。 70%的數據:線段樹,完成區間修改,直接下傳翻轉標記即可。時間復雜度O(Tlogn)。 100%的數據: 先對每個位置,如果與前一個相同,就寫0,不同則寫1; 然后一個區間修改就變成了兩點修改辣! 就相當于對L位置和R+1位置取反。 然后就可以A掉辣! 時間復雜度O(n+T) Code
來源 Source 感謝學哥提供問題,學姐提供解答。 原題為:n個二進制位排成一個環,給定初始狀態。每次操作可以翻轉連續的k位,問全部變成1或0的最小操作次數。