nssl1476 聯 線段樹

2021-10-09 04:41:32 字數 1833 閱讀 4080

無限長的01

0101

序列,每次進行乙個操作

區間內賦值為0

00區間內賦值為1

11區間取反

求第乙個0

00的位置

離散化(儲存每個區間的左右端點和他們加一之後的值)後可以用線段樹儲存第乙個0

00和第乙個1

11的位置。然後區間取反時就交換兩個值並且讓laz

ylazy

lazy

標記同樣取反即可

時間複雜度o(n

log⁡n)

o(n\log n)

o(nlogn)

#include

#include

#include

#define ll long long

using

namespace std;

const ll n=

4e5+10;

ll n,m,l[n]

,r[n]

,op[n]

,a[n]

;ll minw[n*4]

,minb[n*4]

,lazy[n*4]

;void

downdata

(ll x,ll l,ll r,ll op)

else lazy[x]

=op;

if(op==1)

minw[x]

=l,minb[x]

=n+1

;else

if(op==2)

minw[x]

=n+1

,minb[x]

=l;else

swap

(minw[x]

,minb[x]);

return;}

void

change

(ll x,ll l,ll r,ll l,ll r,ll op)

ll mid=

(l+r)

>>1;

if(lazy[x])if

(r<=mid)

change

(x*2

,l,mid,l,r,op)

;else

if(l>mid)

change

(x*2+1

,mid+

1,r,l,r,op)

;else

change

(x*2

,l,mid,l,mid,op)

,change

(x*2+1

,mid+

1,r,mid+

1,r,op)

; minw[x]

=min

(minw[x*2]

,minw[x*2+

1]);

minb[x]

=min

(minb[x*2]

,minb[x*2+

1]);

return;}

intmain()

a[++n]=1

;sort

(a+1

,a+1

+n);

n=unique

(a+1

,a+1

+n)-a-1;

a[n+1]

=a[n]+1

;for

(ll i=

1;i4;i++

) minb[i]

=minw[i]

=n+1

;change(1

,1,n,1

,n,2);

for(ll i=

1;i<=m;i++

)}

14 7 新增職工

1 功能分析 用乙個陣列去儲存所有使用者新增的職工,但我們知道,陣列裡只能存放相同型別的元素。多型技術正好滿足的這一需求。例如,建立普通員工時可以這樣寫 worker worker new employee 建立經理時可以這樣寫 worker worker new manager 這樣,這個陣列裡儲...

nssl 1336 膜拜神牛

d es crip tion description descri ptio n 給定長度為n nn的序列a aa和b bb,若滿足ai aj a i geq a j ai aj 且bi b jb i leq b j bi bj 則i,ji,j i,j互相膜拜,求最大的互不膜拜集合 資料範圍 n 1...

C 程式設計 147 執行緒基礎

啟動執行緒 threadstart ts newthreadstart method 建立委託例項 thread t newthread ts 建立執行緒 t.start 啟動執行緒 執行緒休眠 t.suspend 執行緒掛起 thread.sleep 1000 執行緒休眠 t.resume 執行緒...