扶蘇學長給我們講了線段樹、樹狀陣列、主席樹等資料結構
並發布了練習題單……
題目:a:
只需將maketag函式更改為異或和即可
然後tag的更新方式更改
#include#include#include
using
namespace
std;
const
long
long k=5e5+5
;long
long
a[k];
struct
segment
else
}inline
void
maketag()
void
spread()
}
inline
bool out(const
long
long l,const
long
long r)
void change(long
long l,long
long
r)
else}}
long
long ask(long
long l,long
long
r) }}
};segment *root;
int main(void
)
root=new segment(1
,n);
for(long
long i=1;i<=m;i++)
else
}}
b、d:
模板不多說
c:該題沒有修改,只有詢問,所以只維護乙個最小值即可
#include#include#include
using
namespace
std;
const
long
long k=5e5+5
;long
long
a[k];
struct
segment
else
}inline
bool out(const
long
long l,const
long
long r)
long
long ask(long
long l,long
long
r) }}
};segment *root;
int main(void
)}
f:維護乙個區間和與乙個區間平方和
再對方差公式進行推導
即可
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;
7const
int maxn=100005;8
double
a[maxn];
9int
n,q;
10struct
node
22else29}
30 inline void
pushup()
34 inline void
pushdown()41}
42 inline void maketag(double
w)47 inline bool inrange(const
int l,const
intr)
50 inline bool outofrange(const
int l,const
intr)
53 inline void upd(const
int l,const
int r,double
w)else
if(!outofrange(l,r))62}
63double qry(const
int l,const
intr)
67if
(outofrange(l,r))
70else74}
75double qry1(const
int l,const
intr)
79if
(outofrange(l,r))
82else86}
87};
88int
main()
8994 node *rot=new node(1
,n);
95for(int i=1;i<=q;i++)
102if(o==1
)106
if(o==2
)109
if(o==3
)115
}116
return0;
117 }
g:多次試驗表明,我煎不出來。。。
等扶蘇學長來講吧
h:本題需要使用狀壓優化與位運算
初始時將所有顏色用二進位制數表示
每次上色將對應的數值更新
下傳標記為直接覆蓋
上傳資訊時,將兩個數進行或運算
1 #include2 #include3 #include4 #include5 #include6 #include7 #include89using
namespace
std;
1011
intl, t, o, lf, rt, color;
12char
op;13
14struct
node
22 inline bool outofrange(const
int l, const
intr)
25 inline void maketag(const
long
long
x)29 inline void
pushdown()
35 inline void
pushup()
39if(rs != null)
*/42 v = (ls->v) | (rs->v);43}
44 node (const
int l, const
intr)
54else60}
61 inline void upd(const
int l, const
int r, const
long
long
x)65
else
if(!outofrange(l, r))71}
72 inline long
long query(const
int l, const
intr)
76else
if(!outofrange(l, r))
80else
return0;
81}82};
8384 inline int bit(const
long
long
n)90
return
res;91}
9293
intmain()
104else
109}110
111return0;
112 }
i、j:
這兩個題mod做
e將會在樹狀陣列時進行講解
另:《棠梨煎雪》可以通過樹狀陣列拿到可觀的部分分
-end-
線段樹題集
poj 2886 反素數 線段樹 題意 有n個人圍成一圈,遊戲的起點是k,每個人持有乙個數字 非編號 num,每次當前的人退出圈,下乙個人是他左邊的第num個 也就是說下乙個退出的是k num,k可以為負數,表示右邊的第num個 現在一直如果乙個人是第i個推出的,那麼他的得分就是i的因數的個數,球得...
線段樹 模板題
problem description 已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 input 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含...
線段樹(模板題)
對於一條數鏈,二分,然後二分,然後再二分 給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。數列元素初始化為0 輸入 輸入資料第一行包含兩個正整數n,m n 100000,m 500000 以下是m行,每行有三個正整數k,a,b k 0或1,a,b n k 0時表示將a處數字加上b,...