• cogs 775. 山海经


    solution

    维护十个域:

    lval  rval  val(中间最大)  sum(区间总值)

    l1 r1  l2 r2 l3 r3

    pushup真是醉了

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<cstring>
      4 using namespace std;
      5 const int N=100006;
      6 const int INF=0x7fffffff/3;
      7 int maxn(int a,int b){return a>b?a:b;}
      8 
      9 int n,m;
     10 int v[N];
     11 
     12 struct son
     13 {
     14     int lval,rval,val,sum;
     15     int l1,l2,l3,r1,r2,r3;
     16 };
     17 son a[N*5];
     18 
     19 void pushup(int x)
     20 {
     21     int lson=x<<1,rson=x<<1|1;
     22     if(a[lson].lval>=a[lson].sum+a[rson].lval)
     23     {
     24         a[x].lval=a[lson].lval;
     25         a[x].l1=a[lson].l1;
     26         a[x].r1=a[lson].r1;
     27     }
     28     else
     29     {
     30         a[x].lval=a[lson].sum+a[rson].lval;
     31         a[x].l1=a[lson].l1;
     32         a[x].r1=a[rson].r1;
     33     }
     34     
     35     if(a[rson].sum+a[lson].rval>=a[rson].rval)
     36     {
     37         a[x].rval=a[rson].sum+a[lson].rval;
     38         a[x].l2=a[lson].l2;
     39         a[x].r2=a[rson].r2;
     40     }
     41     else
     42     {
     43         a[x].rval=a[rson].rval;
     44         a[x].l2=a[rson].l2;
     45         a[x].r2=a[rson].r2;
     46     }
     47     
     48     int temp=a[lson].rval+a[rson].lval;
     49     int maxl=maxn(maxn(a[lson].val,a[rson].val),temp);
     50     a[x].val=maxl;
     51     if(maxl==a[lson].val)
     52     {
     53         a[x].l3=a[lson].l3;
     54         a[x].r3=a[lson].r3;
     55     }
     56     else
     57       if(maxl==temp)
     58       {
     59             a[x].l3=a[lson].l2;
     60             a[x].r3=a[rson].r1;
     61         }
     62     else
     63     {
     64         a[x].l3=a[rson].l3;
     65         a[x].r3=a[rson].r3;
     66     }
     67     
     68     a[x].sum=a[lson].sum+a[rson].sum;
     69 }
     70 
     71 void build(int l,int r,int x)
     72 {
     73     if(l==r)
     74     {
     75         a[x].lval=a[x].rval=a[x].val=a[x].sum=v[l];
     76         a[x].l1=a[x].l2=a[x].l3=a[x].r1=a[x].r2=a[x].r3=l;
     77         return ;
     78     }
     79     int mid=(l+r)>>1;
     80     build(l,mid,x<<1);
     81     build(mid+1,r,x<<1|1);
     82     pushup(x);
     83 }
     84 
     85 son qq(int L,int R,int l,int r,int x)
     86 {
     87     if(L<=l&&r<=R)
     88       return a[x];
     89     int mid=(l+r)>>1;
     90     son ans,lson,rson;
     91     if(L<=mid)
     92       lson=qq(L,R,l,mid,x<<1);
     93     if(mid<R)
     94       rson=qq(L,R,mid+1,r,x<<1|1);
     95     
     96     if(L<=mid&&mid<R)
     97     {
     98         if(lson.lval>=lson.sum+rson.lval)
     99         {
    100             ans.lval=lson.lval;
    101             ans.l1=lson.l1;
    102             ans.r1=lson.r1;
    103         }
    104         else
    105         {
    106             ans.lval=lson.sum+rson.lval;
    107             ans.l1=lson.l1;
    108             ans.r1=rson.r1;
    109         }
    110         
    111         if(rson.sum+lson.rval>=rson.rval)
    112         {
    113             ans.rval=rson.sum+lson.rval;
    114             ans.l2=lson.l2;
    115             ans.r2=rson.r2;
    116         }
    117         else
    118         {
    119             ans.rval=rson.rval;
    120             ans.l2=rson.l2;
    121             ans.r2=rson.r2;
    122         }
    123         
    124         int temp=lson.rval+rson.lval;
    125         int maxl=maxn(maxn(lson.val,rson.val),temp);
    126         ans.val=maxl;
    127         if(maxl==lson.val)
    128         {
    129             ans.l3=lson.l3;
    130             ans.r3=lson.r3;
    131         }
    132         else
    133           if(maxl==temp)
    134           {
    135                 ans.l3=lson.l2;
    136                 ans.r3=rson.r1;
    137             }
    138         else
    139         {
    140             ans.l3=rson.l3;
    141             ans.r3=rson.r3;
    142         }
    143         
    144         ans.sum=lson.sum+rson.sum;
    145     }
    146     else
    147       if(L<=mid)
    148         ans=lson;
    149     else
    150       ans=rson;
    151     return ans;
    152 }
    153 
    154 int main(){
    155     freopen("hill.in","r",stdin);
    156     freopen("hill.out","w",stdout);
    157     scanf("%d%d",&n,&m);
    158     for(int i=1;i<=n;++i)
    159       scanf("%d",&v[i]);
    160     
    161     build(1,n,1);
    162     
    163     while(m--)
    164     {
    165         int aa,bb;
    166         scanf("%d%d",&aa,&bb);
    167         son temp=qq(aa,bb,1,n,1);
    168         int maxl=maxn(maxn(temp.lval,temp.rval),temp.val);
    169         if(maxl==temp.lval)
    170             printf("%d %d %d
    ",temp.l1,temp.r1,maxl);
    171         else
    172           if(maxl==temp.val)
    173             printf("%d %d %d
    ",temp.l3,temp.r3,maxl);
    174         else
    175           printf("%d %d %d
    ",temp.l2,temp.r2,maxl);
    176     }
    177     //while(1);
    178     return 0;
    179 }
    code
  • 相关阅读:
    PHP session
    PHP范例注册审核
    php文件操作
    JSON 弹窗
    PDO
    CSP-S2020 游记
    Meissel-Lehmer算法 学习笔记
    [AGC046C] Shift 题解
    Min_25筛学习笔记
    GDOI2020 游记
  • 原文地址:https://www.cnblogs.com/A-LEAF/p/7289268.html
Copyright © 2020-2023  润新知