⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pku 2750 线段树 最大连续区间.txt

📁 ACM资料大集合
💻 TXT
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream>
using namespace std;

#define NMAX 100005
//PKU 2750 线段树 最大连续区间

typedef struct optree
{
    int left;
    int right;
    int value;
    int min;//无限制的区间最小值
    int max;
    int lisum;//从左边起的区间最小值
    int risum;
    int lxsum;
    int rxsum;
    int sum;
	int mm;
}optree;

optree tree[NMAX*3];
int pa[NMAX];

int gmax(int a,int b) {return a>b?a:b;}
int gmax(int a,int b,int c) 
{
	if(a>b) return a>c?a:c;
	else return b>c?b:c;
}

int gmin(int a,int b) {return a<b?a:b;}
int gmin(int a,int b,int c)
{
	if(a<b) return a<c?a:c;
	else return b<c?b:c;
}

void update(int p)
{
    int t;
 while(p>=1)
 {
    tree[p].sum=tree[2*p].sum+tree[2*p+1].sum;
	tree[p].max=gmax(tree[2*p].max,tree[2*p+1].max,tree[2*p].rxsum+tree[2*p+1].lxsum);
	tree[p].lxsum=gmax(tree[2*p].lxsum,tree[2*p].sum+tree[2*p+1].lxsum);
	tree[p].rxsum=gmax(tree[2*p+1].rxsum,tree[2*p].rxsum+tree[2*p+1].sum);
	tree[p].min=gmin(tree[2*p].min,tree[2*p+1].min,tree[2*p].risum+tree[2*p+1].lisum);
	tree[p].lisum=gmin(tree[2*p].lisum,tree[2*p].sum+tree[2*p+1].lisum);
	tree[p].risum=gmin(tree[2*p+1].risum,tree[2*p].risum+tree[2*p+1].sum);
    p=p/2;
 }
}

void build(int p,int l,int r)
{
 tree[p].left=l;
 tree[p].right=r;
 tree[p].sum=tree[p].mm=tree[p].lisum=tree[p].risum=tree[p].lxsum=tree[p].rxsum=0;
 if(r!=l)
 {
     tree[p].value=-1;
     build(2*p,l,(l+r)/2);
     build(2*p+1,(l+r)/2+1,r);
 }
 else
 {
     tree[p].value=l;
 }
}

void solve(int key,int v)
{
    int p,mid;
    p=1;
    while(tree[p].value==-1)
    {
        mid=(tree[p].left+tree[p].right)/2;
        if(key<=mid) p=p*2;
        else p=p*2+1;
    }
    tree[p].sum=tree[p].mm=v;
	tree[p].max=tree[p].min=tree[p].lisum=tree[p].risum=tree[p].lxsum=tree[p].rxsum=v;
    update(p/2);
}

void init(int num)
{
    int i;
    build(1,1,num);
    for(i=1;i<=num;i++)
        solve(i,pa[i]);
}

int main()
{
    int i,num,qnum,qa,qb,ans;
    scanf("%d",&num);
    for(i=1;i<=num;i++) scanf("%d",&pa[i]);
    scanf("%d",&qnum);
    init(num);
    for(i=1;i<=qnum;i++)
    {
        scanf("%d %d",&qa,&qb);
        solve(qa,qb);
 		if(tree[1].min>0) 	
			ans=tree[1].sum-tree[1].min;		
		else ans=gmax(tree[1].max,tree[1].sum-tree[1].min);
		printf("%d\n",ans);		
    }
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -