洛谷 p3870 開關 線段樹模板

2022-05-08 05:24:06 字數 1213 閱讀 4067

這兩天學了很長時間於是做了一道水題

我就用了模板,就連任何優化都沒有

就ac了,複雜度也很**10個點1500多毫秒

這個題就是把lazy改成記錄下修改的次數,每次修改的時候mod 2,因為反過來再返回去就一樣了

修改變成

sum[root] = r - l + 1 - sum[root];
其他的幾乎就沒區別了

#includeusing namespace std;

inline int read()while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}

inline void write(int x)

int sum[400010],lazy[400010];

void add(int root,int l,int r,int k)

void putdown(int root,int l,int r)

void change(int root,int l,int r,int x,int y)

int mid = (l + r) >> 1;

putdown(root,l,r);//標記不到正確位置就繼續發

int left = root << 1;

int right = left + 1;

if(x <= mid) change(left,l,mid,x,y);

if(mid < y) change(right,mid + 1,r,x,y);

sum[root] = sum[left] + sum[right];//更新父節點

}int find(int root,int l,int r,int x,int y)

int mid = (l + r) >> 1,ans = 0;

int left = root << 1;

int right = left + 1;

putdown(root,l,r);//傳到需要的地方

if(x <= mid) ans += find(left,l,mid,x,y);

if(mid < y) ans += find(right,mid + 1,r,x,y);

return ans;

}int main()

else

} return 0;

}

洛谷3870 開關(線段樹)

題意還是很明顯的,支援區間取反,區間查詢。所以我們線段樹的sum陣列開成二維的,第一維記錄關的燈的數量,第二維記錄開著的燈的數量。push down的lazy標記就swap一下0和1的個數。查詢時返回區間1的sum即可。includeusing namespace std const int max...

洛谷P2846 光開關 線段樹

給出乙個01串,每次有兩種操作 首先,這是一道三倍經驗題。p2574 xor的藝術 p3870 tjoi2009 開關 這兩道題可以用分塊做,但是光開關用分塊會t 這道題其實就是乙個裸的線段樹。用tre e x ltr ee x l和t ree x r tree x r表示這個區間的左右端點,tre...

線段樹模板 洛谷P2023

傳送門 這個題目的區間更新有加法和乘法。所以比裸的線段樹難一點點吧,也就僅僅是一點點。既然存在兩個操作,所以我們就要維護兩個tag,乙個加法乙個乘法。但是pushdown的時候這兩個tag怎麼pushdown呢?乘法的優先順序顯然比加法高,所以我們在mul更新的時候要先pushdown,這是乙個要點...