zoukankan      html  css  js  c++  java
  • Vijos1083 小白逛公园

    题目

    vijos1083

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cmath> 
    #define N 500005
    #define inf 0xfffffff
    using namespace std; 
    
    int n,m,a[N];
    
    struct node
    {
    	int l,r,sum;//左右端点,区间和 
    	int lm,rm,mx;//从左端点往右能取到的最大区间和,从右端点往左能取到的最大区间和,当前区间内能取到的最大连续子段和  
    	node(){sum=0;lm=rm=mx=-inf;}
    }T[N*10];
    
    node operator + (node x,node y)
    {
    	node rnt;
    	rnt.sum=x.sum+y.sum;
    	rnt.lm=max(x.lm,x.sum+y.lm);
    	rnt.rm=max(y.rm,y.sum+x.rm);
    	rnt.mx=max(max(x.mx,y.mx),x.rm+y.lm);
    	return rnt;
    }
    
    void pushup(int p)
    {
    	int pl=p<<1,pr=p<<1|1;
    	T[p].sum=T[pl].sum+T[pr].sum;
    	T[p].lm=max(T[pl].lm,T[pl].sum+T[pr].lm);
    	T[p].rm=max(T[pr].rm,T[pr].sum+T[pl].rm);
    	T[p].mx=max(max(T[pl].mx,T[pr].mx),T[pl].rm+T[pr].lm);
    }
    
    void build(int p,int x,int y)
    {
    	T[p].l=x;T[p].r=y;
    	if(x==y) 
    	{
    		T[p].lm=T[p].rm=T[p].mx=T[p].sum=a[x];
    		return;
    	}
    	if(x<y)
    	{
    		int mid=(x+y)>>1;
    		build(p<<1,x,mid);build(p<<1|1,mid+1,y);
    		pushup(p);
    	} 
    } 
    
    void update(int p,int pos,int x)
    {
    	int pl=T[p].l,pr=T[p].r;
    	if(pl==pr)
    	{
    		T[p].lm=T[p].rm=T[p].mx=T[p].sum=x;
    		return;
    	}
    	int mid=(pl+pr)>>1;
    	if(pos<=mid) update(p<<1,pos,x);
    	else update(p<<1|1,pos,x);
    	pushup(p);
    } 
    
    node query(int p,int x,int y)
    {
    	int pl=T[p].l,pr=T[p].r;
    	if(pl==x&&pr==y) return T[p];
    	int mid=(pl+pr)>>1;
    	if(y<=mid) return query(p<<1,x,y);
    	else if(x>mid) return query(p<<1|1,x,y);
    	else
    	{
    		node left,right;
    		left=query(p<<1,x,mid);
    		right=query(p<<1|1,mid+1,y);
    		return left+right;
    	}
    }
    
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    	build(1,1,n);
    	for(int i=1;i<=m;i++)
    	{
    		int opt,a,b;scanf("%d%d%d",&opt,&a,&b);
    		if(opt==1)
    		{
    			if(a>b) swap(a,b);
    			printf("%d
    ",query(1,a,b).mx);
    		} 
    		else update(1,a,b);
    	}
    	return 0;
    }
  • 相关阅读:
    LC.225. Implement Stack using Queues(using two queues)
    LC.232. Implement Queue using Stacks(use two stacks)
    sort numbers with two stacks(many duplicates)
    LC.154. Find Minimum in Rotated Sorted Array II
    LC.81. Search in Rotated Sorted Array II
    LC.35.Search Insert Position
    前后端分离:(一)
    Redis基本使用(一)
    GIT篇章(二)
    GIT篇章(一)
  • 原文地址:https://www.cnblogs.com/XYZinc/p/7631419.html
Copyright © 2011-2022 走看看