ACM大牛总结的线段树专辑超经典的Word下载.docx
- 文档编号:17909498
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:32
- 大小:34.60KB
ACM大牛总结的线段树专辑超经典的Word下载.docx
《ACM大牛总结的线段树专辑超经典的Word下载.docx》由会员分享,可在线阅读,更多相关《ACM大牛总结的线段树专辑超经典的Word下载.docx(32页珍藏版)》请在冰豆网上搜索。
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include<
cstdio>
#definelsonl,m,rt<
<
1
#definersonm+1,r,rt<
1|1
constintmaxn=55555;
intsum[maxn<
2];
voidPushUP(intrt){
sum[rt]=sum[rt<
1]+sum[rt<
1|1];
}
voidbuild(intl,intr,intrt){
if(l==r){
scanf("
%d"
&
sum[rt]);
return;
}
intm=(l+r)>
>
1;
build(lson);
build(rson);
PushUP(rt);
voidupdate(intp,intadd,intl,intr,intrt){
sum[rt]+=add;
if(p<
=m)update(p,add,lson);
elseupdate(p,add,rson);
intquery(intL,intR,intl,intr,intrt){
if(L<
=l&
&
r<
=R){
returnsum[rt];
intret=0;
=m)ret+=query(L,R,lson);
if(R>
m)ret+=query(L,R,rson);
returnret;
intmain(){
intT,n;
scanf("
T);
for(intcas=1;
cas<
=T;
cas++){
printf("
Case%d:
\n"
cas);
n);
build(1,n,1);
charop[10];
while(scanf("
%s"
op)){
if(op[0]=='
E'
)break;
inta,b;
scanf("
%d%d"
a,&
b);
Q'
)printf("
%d\n"
query(a,b,1,n,1));
elseif(op[0]=='
S'
)update(a,-b,1,n,1);
elseupdate(a,b,1,n,1);
}
return0;
ohdu1754IHateIt
单点替换query:
区间最值
algorithm>
usingnamespacestd;
constintmaxn=222222;
intMAX[maxn<
MAX[rt]=max(MAX[rt<
1],MAX[rt<
1|1]);
MAX[rt]);
voidupdate(intp,intsc,intl,intr,intrt){
MAX[rt]=sc;
=m)update(p,sc,lson);
elseupdate(p,sc,rson);
returnMAX[rt];
=m)ret=max(ret,query(L,R,lson));
m)ret=max(ret,query(L,R,rson));
intn,m;
while(~scanf("
n,&
m)){
while(m--){
charop[2];
%s%d%d"
op,&
ohdu1394MinimumInversionNumber
求Inversion后的最小逆序数
用O(nlogn)复杂度求出最初逆序数后,就可以用O
(1)的复杂度分别递推出其他解
constintmaxn=5555;
sum[rt]=0;
if(l==r)return;
voidupdate(intp,intl,intr,intrt){
sum[rt]++;
=m)update(p,lson);
elseupdate(p,rson);
intx[maxn];
intn;
n)){
build(0,n-1,1);
intsum=0;
for(inti=0;
i<
n;
i++){
x[i]);
sum+=query(x[i],n-1,0,n-1,1);
update(x[i],0,n-1,1);
intret=sum;
sum+=n-x[i]-x[i]-1;
ret=min(ret,sum);
ret);
ohdu2795Billboard
h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子
每次找到最大值的位子,然后减去L
query:
区间求最大值的位子(直接把update的操作在query里做了)
inth,w,n;
MAX[rt]=w;
intquery(intx,intl,intr,intrt){
MAX[rt]-=x;
returnl;
intret=(MAX[rt<
1]>
=x)?
query(x,lson):
query(x,rson);
%d%d%d"
h,&
w,&
if(h>
n)h=n;
build(1,h,1);
while(n--){
intx;
x);
if(MAX[1]<
x)puts("
-1"
);
elseprintf("
query(x,1,h,1));
∙练习:
opoj2828BuyTickets
opoj2886WhoGetstheMostCandies?
∙成段更新(通常这对初学者来说是一道坎),需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候
ohdu1698JustaHook
成段替换(由于只query一次总区间,所以可以直接输出1结点的信息)
constintmaxn=111111;
intcol[maxn<
voidPushUp(intrt){
voidPushDown(intrt,intm){
if(col[rt]){
col[rt<
1]=col[rt<
1|1]=col[rt];
sum[rt<
1]=(m-(m>
1))*col[rt];
1|1]=(m>
1)*col[rt];
col[rt]=0;
col[rt]=0;
sum[rt]=1;
PushUp(rt);
voidupdate(intL,intR,intc,intl,intr,intrt){
col[rt]=c;
sum[rt]=c*(r-l+1);
PushDown(rt,r-l+1);
=m)update(L,R,c,lson);
m)update(L,R,c,rson);
intT,n,m;
m);
inta,b,c;
b,&
c);
update(a,b,c,1,n,1);
Thetotalvalueofthehookis%d.\n"
cas,sum[1]);
opoj3468ASimpleProblemwithIntegers
成段增减query:
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#defineLLlonglong
LLadd[maxn<
LLsum[maxn<
if(add[rt]){
add[rt<
1]+=add[rt];
1|1]+=add[rt];
1]+=add[rt]*(m-(m>
1));
1|1]+=add[rt]*(m>
1);
add[rt]=0;
add[rt]=0;
%lld"
add[rt]+=c;
sum[rt]+=(LL)c*(r-l+1);
if(m<
R)update(L,R,c,rson);
LLquery(intL,intR,intl,intr,intrt){
LLret=0;
R)ret+=query(L,R,rson);
intN,Q;
N,&
Q);
build(1,N,1);
while(Q--){
charop[2];
inta,b,c;
op);
if(op[0]=='
){
printf("
%lld\n"
qu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACM 总结 线段 专辑 经典