zoukankan      html  css  js  c++  java
  • suoi46 最大和和 (线段树)

    《Segment tree Beats!》,反正我不会

      1 #include<bits/stdc++.h>
      2 #define pa pair<int,int>
      3 #define CLR(a,x) memset(a,x,sizeof(a))
      4 using namespace std;
      5 typedef long long ll;
      6 const int maxn=4e5+10;
      7 const ll inf=1e15+1;
      8 
      9 inline ll rd(){
     10     ll x=0;char c=getchar();int neg=1;
     11     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
     12     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
     13     return x*neg;
     14 }
     15 
     16 ll a[maxn];
     17 int N,M;
     18 ll sum[maxn<<2],mn[maxn<<2][2],se[maxn<<2],laz[maxn<<2];
     19 
     20 inline void update(int p){
     21     sum[p]=sum[p<<1]+sum[p<<1|1];
     22     if(mn[p<<1][0]==mn[p<<1|1][0]){
     23         mn[p][0]=mn[p<<1][0],mn[p][1]=mn[p<<1][1]+mn[p<<1|1][1];
     24         se[p]=min(se[p<<1],se[p<<1|1]);
     25     }
     26     else if(mn[p<<1][0]<mn[p<<1|1][0]){
     27         mn[p][0]=mn[p<<1][0],mn[p][1]=mn[p<<1][1];
     28         se[p]=min(se[p<<1],mn[p<<1|1][0]);
     29     }
     30     else if(mn[p<<1][0]>mn[p<<1|1][0]){
     31         mn[p][0]=mn[p<<1|1][0],mn[p][1]=mn[p<<1|1][1];
     32         se[p]=min(se[p<<1|1],mn[p<<1][0]);
     33     }
     34 }
     35 
     36 void pushdown(int p){
     37     if(!laz[p]) return;
     38     ll x=laz[p];laz[p]=0;
     39     if(x<=mn[p][0]) return;
     40     laz[p<<1]=max(x,laz[p<<1]);
     41     laz[p<<1|1]=max(x,laz[p<<1|1]);
     42     if(x<se[p]){
     43         sum[p]+=mn[p][1]*(x-mn[p][0]);
     44         mn[p][0]=x;
     45         return;
     46     }
     47     pushdown(p<<1);pushdown(p<<1|1);
     48     update(p);
     49     
     50 }
     51 
     52 void change(int p,int l,int r,int x,int y,ll z){
     53     if(x<=l&&r<=y){
     54         laz[p]=max(laz[p],z);
     55         pushdown(p);
     56     }
     57     else{
     58         pushdown(p);
     59         int m=l+r>>1;
     60         if(x<=m) change(p<<1,l,m,x,y,z);
     61         else pushdown(p<<1);
     62         if(y>=m+1) change(p<<1|1,m+1,r,x,y,z);
     63         else pushdown(p<<1|1);
     64         update(p);
     65     }
     66 }
     67 
     68 void build(int p,int l,int r){
     69     if(l==r){
     70         mn[p][0]=sum[p]=a[l];
     71         mn[p][1]=1,se[p]=inf;
     72     }else{
     73         int m=l+r>>1;
     74         build(p<<1,l,m);build(p<<1|1,m+1,r);
     75         update(p);
     76     }
     77 }
     78 
     79 ll query(int p,int l,int r,int x,int y){
     80     pushdown(p);
     81     if(x<=l&&r<=y) return sum[p];
     82     int m=l+r>>1;ll re=0;
     83     if(x<=m) re=query(p<<1,l,m,x,y);
     84     if(y>=m+1) re+=query(p<<1|1,m+1,r,x,y);
     85     return re;
     86 }
     87 
     88 int main(){
     89     //freopen("","r",stdin);
     90     int i;
     91     N=rd(),M=rd();
     92     for(i=1;i<=N;i++)
     93         a[i]=rd();
     94     build(1,1,N);
     95     for(i=1;i<=M;i++){
     96         ll a=rd(),b=rd(),c=rd();
     97         if(!a) printf("%lld
    ",query(1,1,N,b,c));
     98         else change(1,1,N,b,c,a);
     99     }
    100     return 0;
    101 }
  • 相关阅读:
    .net中AjaxPro的简单使用
    关于 Activity 中 startActivityForResult 和 onActivityResult
    产品经理值得读的12本书
    存储过程中使用事务与try catch
    扁平化数据解构转化成树形结构
    JavaScript编程精解
    泛型
    OATS:Orthogonal Array Testing Strategy
    等价类划分
    C# homework
  • 原文地址:https://www.cnblogs.com/Ressed/p/9811200.html
Copyright © 2011-2022 走看看