日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线段树之线段操作之陈老师的福利

發布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线段树之线段操作之陈老师的福利 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題面:

在數軸上進行一系列操作。每次操作有兩種類型,一種是在線段[a,b]上涂上顏色,另一種將[a,b]上的顏色擦去。
問經過一系列的操作后,有多少條單位線段[k,k+1]被涂上了顏色

Input:

第一行兩個整數n,m,表示數軸從0到n,操作數為m
接下來m行,每行三個整數op,a,b,op=0時表示將[a,b]上的顏色擦去,op=1時表示在線段[a,b]上涂上顏色
n,m<=100000

Output:

輸出一個整數,表示有多少條單位線段[k,k+1]被涂上了顏色

Solution:

線段樹,tree數組記錄當前區間被染色的長度,如果當前區間全部被染色,則令tree值等于當前區間長度,值得一提的是,要記錄區間長度,只需要記錄l+1到r的點數就行了

Code:

#include<bits/stdc++.h> #define N 400001 using namespace std; int n,m; struct sgt{#define ls (q<<1)#define rs (q<<1|1)int tree[N],lazy[N];void add(int l,int r,int q,int v){tree[q]=r-l+1;if(v==-1)tree[q]=0;lazy[q]=v;}void pushdown(int l,int r,int q){if(lazy[q]==0)return ;int mid=(l+r)>>1;add(l,mid,ls,lazy[q]);add(mid+1,r,rs,lazy[q]);lazy[q]=0;}void change(int l,int r,int L,int R,int q,int v){if(l>R||r<L)return ;if(l>=L&&r<=R)return add(l,r,q,v);pushdown(l,r,q);int mid=(l+r)>>1;if(mid>=L)change(l,mid,L,R,ls,v);if(mid<R)change(mid+1,r,L,R,rs,v);tree[q]=tree[ls]+tree[rs];}int ans(){pushdown(1,n,1);return tree[1];} }T; inline int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f; } int main(){n=read();m=read();for(int i=1;i<=m;i++){int opt,x,y;opt=read();x=read();y=read();if(opt==0)opt--;x++;T.change(1,n,x,y,1,opt);}printf("%d",T.ans());return 0; }

轉載于:https://www.cnblogs.com/NLDQY/p/10085070.html

總結

以上是生活随笔為你收集整理的线段树之线段操作之陈老师的福利的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。