vijos 1083小白 线段树

返回结构体。。。。你妈炸了

  1 program hehe;
  2 type
  3  shu=record
  4   l,r,h,he,maxr,maxl:longint;
  5  end;
  6 var
  7  n,m,i,j,k,ll,rr:longint;
  8  b:array[0..500000] of longint;
  9  x:array[0..5000000] of shu;
 10
 11   function max(a,b:longint):longint;
 12   begin
 13    if a>b then exit(a);
 14    exit(b);
 15   end;
 16
 17   function min(a,b:longint):longint;
 18   begin
 19    if a>b then exit(b);
 20    exit(a);
 21   end;
 22
 23   procedure update(a:longint);
 24   begin
 25    x[a].he:=x[a<<1].he+x[a<<1+1].he;
 26    x[a].h:=max(x[a<<1].h,x[a<<1+1].h);
 27    x[a].h:=max(x[a].h,x[a<<1].maxr+x[a<<1+1].maxl);
 28    x[a].maxl:=max(x[a<<1].maxl,x[a<<1].he+x[a<<1+1].maxl);
 29    x[a].maxr:=max(x[a<<1+1].maxr,x[a<<1+1].he+x[a<<1].maxr);
 30   end;
 31
 32   function num(a,b:longint):longint;
 33   var
 34    mid:longint;
 35   begin
 36    if x[a].l=x[a].r then exit(a);
 37    mid:=(x[a].l+x[a].r)>>1;
 38    if b>mid then exit(num(a<<1+1,b));
 39    exit(num(a<<1,b))
 40   end;
 41
 42   procedure maintain(a,b:longint);
 43   begin
 44    if a=1 then exit;
 45    if x[a].l=x[a].r then
 46    begin
 47     x[a].he:=b;
 48     x[a].h:=b;
 49     x[a].maxr:=b;
 50     x[a].maxl:=b;
 51    end
 52    else update(a);
 53    maintain(a>>1,b);
 54   end;
 55
 56   procedure build(a,l,r:longint);
 57   var
 58    mid:longint;
 59   begin
 60    x[a].l:=l;
 61    x[a].r:=r;
 62    if l=r then
 63    begin
 64     read(x[a].h);
 65     x[a].he:=x[a].h;
 66     x[a].maxl:=x[a].h;
 67     x[a].maxr:=x[a].h;
 68     inc(k);
 69     b[k]:=x[a].h;
 70     exit;
 71    end;
 72    mid:=(l+r)>>1;
 73    build(a<<1,l,mid);
 74    build(a<<1+1,mid+1,r);
 75    update(a);
 76   end;
 77
 78   function plus(a,b:shu):shu;
 79   var
 80    t:shu;
 81   begin
 82    t.maxl:=max(a.maxl,a.he+b.maxl);
 83    t.maxr:=max(a.maxr+b.he,b.maxr);
 84    t.h:=max(max(a.h,b.h),a.maxr+b.maxl);
 85    t.he:=a.he+b.he;
 86    exit(t);
 87   end;
 88
 89   function find(a,l,r:longint):shu;
 90   var
 91    mid,s:longint;
 92   begin
 93    if (x[a].l=l)and(x[a].r=r) then exit(x[a]);
 94    mid:=(x[a].l+x[a].r)>>1;
 95    if l>mid then exit(find(a<<1+1,l,r));
 96    if r<=mid then exit(find(a<<1,l,r));
 97    exit(plus(find(a<<1,l,mid),find(a<<1+1,mid+1,r)));
 98   end;
 99
100 begin
101  readln(n,m);
102  build(1,1,n);
103  for i:=1 to m do
104  begin
105   readln(k,ll,rr);
106   if k=1 then
107   begin
108    if ll>rr then
109    begin
110     j:=ll;
111     ll:=rr;
112     rr:=j;
113    end;
114    writeln(find(1,ll,rr).h);
115   end
116   else
117   begin
118    b[ll]:=rr;
119    ll:=num(1,ll);
120    maintain(ll,rr);
121   end;
122  end;
123 end.

P1083小白逛公园

Accepted

标签:[显示标签]

描述

小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了。

一开始,小白就根据公园的风景给每个公园打了分-.-。小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a、b两个公园)选择连续的一些公园玩。小白当然希望选出的公园的分数总和尽量高咯。同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化。

那么,就请你来帮小白选择公园吧。

格式

输入格式

第一行,两个整数N和M,分别表示表示公园的数量和操作(遛狗或者改变打分)总数。

接下来N行,每行一个整数,依次给出小白 开始时对公园的打分。

接下来M行,每行三个整数。第一个整数K,1或2。K=1表示,小新要带小白出去玩,接下来的两个整数a和b给出了选择公园的范围(1≤a,b≤N, a可以大于b!);K=2表示,小白改变了对某个公园的打分,接下来的两个整数p和s,表示小白对第p个公园的打分变成了s(1≤p≤N)。

其中,1≤N≤500 000,1≤M≤100 000,所有打分都是绝对值不超过1000的整数。

输出格式

小白每出去玩一次,都对应输出一行,只包含一个整数,表示小白可以选出的公园得分和的最大值。

时间: 2024-08-24 14:49:55

vijos 1083小白 线段树的相关文章

Vijos 1083 小白逛公园(线段树)

线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). --------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

【BZOJ】1756【VIJOS】1083小白逛公园

描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择连续的一些公园玩.小白当然希望选出的公园的分数总和尽量高咯.同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化. 那么,就请你来帮小白选择公园

【vijos】1750 建房子(线段树套线段树+前缀和)

https://vijos.org/p/1750 是不是我想复杂了.... 自己yy了个二维线段树,然后愉快的敲打. 但是wa了两法.......sad 原因是在处理第二维的更新出现了个小问题,sad. void pushup1(int x) { for1(i, 1, mm<<2) mn[x][i]=min(mn[lc][i], mn[rc][i]); } 这里注意是mm*4...我该好好想想了..这是在dbg的时候找出来的问题.sad. 我觉得很奇怪,线段树的底层节点一共就mm个,那么整棵树

【vijos】1881 闪烁的繁星(线段树+特殊的技巧)

https://vijos.org/p/1881 这场比赛太难了sad.所以我都没做.. 这题一开始我竟然不会sad(本来就不会),然后我继续yy..yy了好久,竟然yy了个什么可拆分的并查集?(sad,后来发现我是如此sb,根本无法实现..) 然后我弃疗了,比赛干脆不交了..sad 后来看了题解和神犇们热心的指导,这就是一水题.. sad. 我们只需要在线段树维护三个值,L表示这个节点的区间内从左边向又能延伸的最长可行串的长度,R表示这个节点的区间内从右边向左能延伸的最长可行串的长度,mx表示

Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K=1,读入l.r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同 K=2,读入l,r表示询问l~r之间能见到多少种树 (l,r>0) 格式 输入格式 第一行n,m表示道路总长为n,共有m个操作 接下来m行为m个操作 输出格式 对于每个k=2输出一个答案 样例1 样例输入1 5 4 1 1

Vijos P1103 校门外的树【线段树,模拟】

校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种有一棵树. 由于马路上有一些区域要用来建地铁.这些区域用它们在数轴上的起始点和终止点表示. 已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分.现在要把这些区域中的树(包括区域端点处的两棵树)移走.你的任务是计算将这些树都移走后,马路上还有多少棵树. 格式 输入格式 输入的

bzoj1756(vijos1083)--小白逛公园--线段树

Description 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择连续的一些公园玩.小白当然希望选出的公园的分数总和尽量高咯.同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化. 那么,就请你来帮小白

vijos 1659 河蟹王国 线段树区间加、区间查询最大值

河蟹王国 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 https://vijos.org/p/1659 Description 河蟹王国有一位河蟹国王,他的名字叫羊驼.河蟹王国富饶安定,人们和谐相处.有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人.于是,羊驼国王将 他的子民排成了一列(==!!b汗~好长呀).每个人都有一个初始的和谐值.羊驼国王每次会选择一个区间[L,R],这个区间中和谐值最大的人就是国王选 出的人.而且,在某一时间,区间[L