线段树--SP2916 GSS5 - Can you answer these queries V

本文介绍了一种基于线段树的数据结构实现,用于高效处理区间最大子段和的查询问题。通过递归构建和更新节点,实现了对区间内元素的最大连续子序列和的快速查询。适用于需要频繁进行区间操作和查询的应用场景。

传送门
以前讲过的题,会最大子段和然后分类讨论一下就好了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 10005
#define ls cur<<1
#define rs cur<<1|1
#define int long long
using namespace std;

inline int rd(){
	int x=0,f=1;char c=' ';
	while(c<'0' || c>'9') f=c=='-'?-1:1,c=getchar();
	while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();
	return x*f;
}

int t,n,m,a[N];

struct Node{
	int l,r,sum,mx,lmx,rmx;
	Node(){l=r=sum=mx=lmx=rmx=0;}
}node[N<<2];

inline void pushup(int cur){
	node[cur].sum=node[ls].sum+node[rs].sum;
	node[cur].lmx=max(node[ls].lmx,node[ls].sum+node[rs].lmx);
	node[cur].rmx=max(node[rs].rmx,node[rs].sum+node[ls].rmx);
	node[cur].mx=max(max(node[ls].mx,node[rs].mx),node[ls].rmx+node[rs].lmx);
}

void build(int cur,int L,int R){
	if(L==R){
		node[cur].l=node[cur].r=L;
		node[cur].sum=node[cur].mx=node[cur].lmx=node[cur].rmx=a[L];
		return;
	}
	int mid=(L+R)>>1;
	build(ls,L,mid); build(rs,mid+1,R);
	node[cur].l=node[ls].l,node[cur].r=node[rs].r;
	pushup(cur); return;
}

Node query(int cur,int L,int R){
	if(L<=node[cur].l && node[cur].r<=R) return node[cur];
	int mid=(node[cur].l+node[cur].r)>>1;
	if(R<=mid) return query(ls,L,R);
	if(L>mid) return query(rs,L,R);
	Node x,y,res;
	x=query(ls,L,R); y=query(rs,L,R);
	res.sum=x.sum+y.sum;
	res.lmx=max(x.lmx,x.sum+y.lmx);
	res.rmx=max(y.rmx,y.sum+x.rmx);
	res.mx=max(max(x.mx,y.mx),x.rmx+y.lmx);
	return res;
}

signed main(){
	t=rd();
	int x1,x2,y1,y2;
	while(t--){
		n=rd();
		for(int i=1;i<=n;i++) a[i]=rd();
		build(1,1,n);
		m=rd();
		while(m--){
			x1=rd(),y1=rd(),x2=rd(),y2=rd();
			if(y1+1<x2) 
			printf("%lld\n",query(1,x1,y1).rmx+query(1,y1+1,x2-1).sum+query(1,x2,y2).lmx);
			else if(x1==x2 && y1==y2) printf("%lld\n",query(1,x2,y2).mx);
			else if(x1<=x2 && y1>=y2){
				Node x=x1<x2?query(1,x1,x2-1):x,y=query(1,x2,y2);
				printf("%lld\n",max(x.rmx+y.lmx,y.mx));
			}
			else if(x1>=x2 && y1<=y2){
				Node x=query(1,x1,y1),y=y1<y2?query(1,y1+1,y2):y;
				printf("%lld\n",max(x.rmx+y.lmx,x.mx));
			}
			else{
				Node x,y,z; int ans=0;
				if(x1<x2) x=query(1,x1,x2-1);
				else x.rmx=0;
				y=query(1,x2,y2); ans=x.rmx+y.lmx;
				x=query(1,x1,y1); 
				if(x2<=y1) y=query(1,x2,y1),ans=max(ans,y.mx);
				if(y1<y2) z=query(1,y1+1,y2);
				else z.lmx=0;
				ans=max(ans,x.rmx+z.lmx);
				printf("%lld\n",ans);
			}
		}
	}
	return 0;
}
源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开和删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名和应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass如...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值