线段树,T了
查看原帖
线段树,T了
667180
Assassin_HG楼主2024/8/19 18:39

可能是算法问题

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int sum[maxn<<2],a[maxn],sum1[maxn<<2];
int n;
int read() {
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9') {
		if(ch=='-') {
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0' && ch<='9') {
		x=(x<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	return x*f;
}
int ls(int rt) {
	return rt << 1;
}
int rs(int rt) {
	return rt << 1 | 1;
}
void pushUp(int rt) {
	sum[rt] = sum[ls(rt)]+sum[rs(rt)];
	sum1[rt] = min(sum1[ls(rt)],sum1[rs(rt)]);
}
void build(int rt,int l,int r) {
	if(l == r) {
		sum1[rt] = sum[rt] = a[l];
		return;
	}
	int mid = (l+r)>>1;
	build(ls(rt),l,mid);
	build(rs(rt),mid+1,r);
	pushUp(rt);
}
int ask(int rt,int l,int r,int L,int R) {
	if(L <= l && r <= R) {
		return sum[rt];
	}
	pushUp(rt);
	int mid = (l+r) >> 1;
	int res = 0;
	if(L <= mid) {
		res += ask(ls(rt),l,mid,L,R);
	}
	if(R > mid) {
		res += ask(rs(rt),mid+1,r,L,R);
	}
	return res;
}
int ask1(int rt,int l,int r,int L,int R) {
	if(L <= l && r <= R) {
		return sum1[rt];
	}
	pushUp(rt);
	int mid = (l+r) >> 1;
	int res = 1e9;
	if(L <= mid) {
		res = min(res,ask1(ls(rt),l,mid,L,R));
	}
	if(R > mid) {
		res = min(res,ask1(rs(rt),mid+1,r,L,R));
	}
	return res;
}
int main() {
//	freopen("feel.in","r",stdin);
//	freopen("feel.out","w",stdout);
	n = read();
	for(int i = 1; i <= n; ++i) {
		a[i] = read();
	}
	build(1,1,n);
	int Max = -2e9;
	for(int i = 1; i <= n; ++i) {
		for(int j = i; j <= n; ++j) {
			Max = max(Max,ask1(1,1,n,i,j) * ask(1,1,n,i,j));
		}
	}
	printf("%d",Max);
	return 0;
}
2024/8/19 18:39
加载中...