無限長的01
0101
序列,每次進行乙個操作
區間內賦值為0
00區間內賦值為1
11區間取反
求第乙個0
00的位置
離散化(儲存每個區間的左右端點和他們加一之後的值)後可以用線段樹儲存第乙個0
00和第乙個1
11的位置。然後區間取反時就交換兩個值並且讓laz
ylazy
lazy
標記同樣取反即可
時間複雜度o(n
logn)
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 執行緒...