UESTC 1425(线段树)

该题有两种操作,a和q。

对于a,我们在每一个节点设计一个add标记。

对于q,首先我们在每个节点设计一个lcis代表该区间的最长上升子串。

显然,这个值和三个值有关。

1.左儿子的lcis

2.右儿子的lcis

3.左右儿子合并lcis

现在关键就是解决3,我们在每个节点设计四个值,left,right,lmost,rmost,

分别代表区间最左边的值,最右边的值,最左边的最长上升子串能到达的最右端,

最右边的最长上升子串能到达的最左端.那么3就能够解决了.只用判断lson的right

和rson的left的大小情况,如果可以合并,那么3求得的值就是rson.lmost-lson.rmost+1。

线段树功能:updata 成段更新,query 区间最值。


#include<cstdio>    
#include<iostream>    
#include<cstring>    
#include<algorithm>    
#include<cmath>    
using namespace std;    
#define lc l,m,index<<1    
#define rc m+1,r,index<<1|1    
#define N 100100    
struct node    
{    
	int add;    
	int lcis;    
	int left,right;    
	int lmost,rmost;    
}seg[N<<2];    
int n,q;    
void pushup(int index,int m)    
{    
	node& father=seg[index];    
	node& lson=seg[index<<1];    
	node& rson=seg[index<<1|1];    
	father.lcis=max(lson.lcis,rson.lcis);    
	father.left=lson.left;    
	father.right=rson.right;    
	father.lmost=lson.lmost;    
	father.rmost=rson.rmost;    
	if(lson.right<rson.left)    
	{    
		father.lcis=max(father.lcis,rson.lmost-lson.rmost+1);    
		if(father.lmost==m)father.lmost=rson.lmost;    
		if(father.rmost==m+1)father.rmost=lson.rmost;    
	}    
}    
void build(int l,int r,int index)    
{    
	int m=(l+r)>>1;    
	seg[index].add=0;    
	if(l==r)    
	{    
		scanf("%d",&seg[index].left);    
		seg[index].right=seg[index].left;    
		seg[index].lcis=1;    
		seg[index].lmost=seg[index].rmost=l;    
		return;    
	}    
	build(lc);    
	build(rc);    
	pushup(index,m);    
}    
void pushdown(int index)    
{    
	node& father=seg[index];    
	node& lson=seg[index<<1];    
	node& rson=seg[index<<1|1];    
	if(father.add)    
	{    
		lson.add+=father.add;    
		lson.left+=father.add;    
		lson.right+=father.add;    
		rson.add+=father.add;    
		rson.left+=father.add;    
		rson.right+=father.add;    
		father.add=0;    
	}    
}    
void updata(int L,int R,int num,int l,int r,int index)    
{    
	int m=(l+r)>>1;    
	if (L == l && r == R)    
	{    
		seg[index].add+=num;    
		seg[index].left+=num;    
		seg[index].right+=num;    
		return;    
	}    
	pushdown(index);    
	if(R<=m)updata(L,R,num,lc);    
	else if(L>m)updata(L,R,num,rc);  
	else  
	{  
		updata(L,m,num,lc);  
		updata(m+1,R,num,rc);  
	}  
	pushup(index,m);    
}    
int query(int L,int R,int l,int r,int index)    
{    
	int m=(l+r)>>1;    
	if (L == l && r == R)return seg[index].lcis;    
	pushdown(index);    
	if(R<=m)return query(L,R,lc);    
	else if(L>m)return query(L,R,rc);  
	else  
	{  
		int ret;    
		ret=max(query(L,m,lc),query(m+1,R,rc));    
		if(seg[index<<1].right<seg[index<<1|1].left)    
		{    
			ret=max(ret,min(seg[index<<1|1].lmost,R)-max(seg[index<<1].rmost,L)+1);    
		}    
		return ret;  
	}  
}    
int main()    
{    
	int t,tcase=1,a,b,c;    
	char op[2];    
	scanf("%d",&t);    
	while(t--)    
	{    
		printf("Case #%d:\n",tcase++);    
		scanf("%d%d",&n,&q);    
		build(1,n,1);    
		while(q--)    
		{    
			scanf("%s%d%d",op,&a,&b);    
			if(op[0]=='a')    
			{    
				scanf("%d",&c);    
				updata(a,b,c,1,n,1);    
			}    
			else    
			{    
				printf("%d\n",query(a,b,1,n,1));    
			}    
		}    
	}    
	return 0;    
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
互联网络程序设计是指在互联网上进行程序开发和设计的过程。UESTC则是我国的一所著名高校——电子科技大学。 互联网络程序设计 uestc包含了两个主要的方面:互联网络和程序设计。互联网络是指将多个计算机网络通过通信链路互相连接起来,实现信息共享和资源共享的网络系统。程序设计是指根据需求和目标,通过编写代码和设计算法,实现计算机程序的过程。 互联网络程序设计 uestc的学习内容主要包括以下几个方面: 1. 网络知识:学习互联网络的基本概念、原理和协议,如TCP/IP协议、HTTP协议等。掌握网络编程的基本技术,能够编写网络应用程序。 2. 数据通信:学习数据通信的基本原理和技术,包括数据传输的方式、数据压缩和加密等。了解网络安全和数据保护的基本知识。 3. 程序设计:学习编程语言和开发工具,如Java、C++和Python等。掌握常用的编程技巧和方法,能够设计和实现复杂的网络应用程序。 4. Web开发:学习Web开发的基本知识和技术,包括HTML、CSS、JavaScript等。能够设计和实现交互式的Web应用程序。 5. 数据库技术:学习数据库的基本原理和技术,如SQL语言和数据库管理系统。能够设计和管理数据库,实现数据的存储和检索。 通过学习互联网络程序设计 uestc,可以掌握互联网应用开发的基本技能,具备设计和实现网络应用程序的能力。这对于目前互联网行业的人才需求来说是非常重要的,也为学生提供了广阔的就业和创业机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值