zoukankan      html  css  js  c++  java
  • SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III

     SPOJ - GSS3 

    这道题和洛谷的小白逛公园一样的题目。

    传送门:

    洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)

     

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int maxn=5e4+10;
     5 #define lson l,m,rt<<1
     6 #define rson m+1,r,rt<<1|1
     7 
     8 struct Tree{
     9     int pre,suf,sub,val;
    10 }tree[maxn<<2];
    11 
    12 Tree pushup(Tree l,Tree r)
    13 {
    14     Tree rt;
    15     rt.pre=max(l.pre,l.val+r.pre);
    16     rt.suf=max(r.suf,r.val+l.suf);
    17     rt.sub=max(max(l.sub,r.sub),l.suf+r.pre);
    18     rt.val=l.val+r.val;
    19     return rt;
    20 }
    21 
    22 void build(int l,int r,int rt)
    23 {
    24     if(l==r){
    25         scanf("%d",&tree[rt].val);
    26         tree[rt].pre=tree[rt].suf=tree[rt].sub=tree[rt].val;
    27         return ;
    28     }
    29 
    30     int m=(l+r)>>1;
    31     build(lson);
    32     build(rson);
    33     tree[rt]=pushup(tree[rt<<1],tree[rt<<1|1]);
    34 }
    35 
    36 void update(int pos,int c,int l,int r,int rt)
    37 {
    38     if(l==r){
    39         tree[rt].pre=tree[rt].suf=tree[rt].sub=tree[rt].val=c;
    40         return ;
    41     }
    42 
    43     int m=(l+r)>>1;
    44     if(pos<=m) update(pos,c,lson);
    45     if(pos> m) update(pos,c,rson);
    46     tree[rt]=pushup(tree[rt<<1],tree[rt<<1|1]);
    47 }
    48 
    49 Tree query(int L,int R,int l,int r,int rt)
    50 {
    51     if(L<=l&&r<=R){
    52         return tree[rt];
    53     }
    54 
    55     int m=(l+r)>>1;
    56     Tree ret,lret,rret;
    57     int flag1=0,flag2=0;
    58     if(L<=m) {lret=query(L,R,lson);flag1=1;}
    59     if(R> m) {rret=query(L,R,rson);flag2=1;}
    60 
    61     if(flag1&&flag2) ret=pushup(lret,rret);
    62     else if(flag1) ret=lret;
    63     else if(flag2) ret=rret;
    64     return ret;
    65 }
    66 
    67 int main()
    68 {
    69     int n;
    70     scanf("%d",&n);
    71     build(1,n,1);
    72     int m;
    73     scanf("%d",&m);
    74     for(int i=1;i<=m;i++){
    75         int op,l,r;
    76         scanf("%d%d%d",&op,&l,&r);
    77         if(op==0){
    78             update(l,r,1,n,1);
    79         }
    80         else{
    81             Tree ans=query(l,r,1,n,1);
    82             printf("%d
    ",ans.sub);
    83         }
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    Vue生命周期总结
    jQuery的层级选择器
    jQuery操作DOM的相关方法
    PHP基本语法
    组件间的传值
    MV*模式
    js 常用事件
    kali使用-WIFI破解
    使用css将网页变成黑白色
    css权重等级
  • 原文地址:https://www.cnblogs.com/ZERO-/p/10679888.html
Copyright © 2011-2022 走看看