這兩天學了很長時間於是做了一道水題
我就用了模板,就連任何優化都沒有
就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,這是乙個要點...