求助,调者关
查看原帖
求助,调者关
1101266
Fe_CuSO4__FeSO4_Cu楼主2025/2/2 13:46

线段树,前4个点全AC,其他的点全TLE。

#include <bits/stdc++.h>
using namespace std;
#define N 1000020
#define ll long long
#define bol bitset
#define imax INT_MAX
#define imin INT_MIN
#define inf 0x3f3f3f3f
#define B 100000010
#define min(a,b) (a<b ? a:b)
#define max(a,b) (a>b ? a:b)
#define lowbit(x) (x&(-x))
#define lt p*2
#define rt p*2+1
const ll X=4*N;
const ll mod1=1e9+7;
const ll mod2=98244353;
//define大队可以看几个主要的。
struct tree
{
	int l,r;
	int maxn,minn;
}t[X];
int a[X];
void build(int p,int l,int r)
{
	t[p].l=l,t[p].r=r;
	if(l==r)
	{
		t[p].maxn=a[l];
		t[p].minn=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(lt,l,mid);
	build(rt,mid+1,r);
	t[p].maxn=max(t[lt].maxn,t[rt].maxn);
	t[p].minn=min(t[lt].minn,t[rt].minn);
}
int sum1(int p,int l,int r)
{
	if(l<=t[p].l&&t[p].r<=r)
	{
		return t[p].maxn;
	}
	int mid=(t[p].l+t[p].r)>>1;
	int sum=INT_MIN;
	if(l<=mid) sum=max(sum,sum1(lt,l,r));
	if(r>mid) sum=max(sum,sum1(rt,l,r));
	return sum;
}
int sum2(int p,int l,int r)
{
	if(l<=t[p].l&&t[p].r<=r)
	{
		return t[p].minn;
	}
	int mid=(t[p].l+t[p].r)>>1;
	int sum=INT_MAX;
	if(l<=mid) sum=min(sum,sum2(lt,l,r));
	if(r>mid) sum=min(sum,sum2(rt,l,r));
	return sum;
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1,j=m;j<=n;i++,j++)
	{
		cout<<sum2(1,i,j)<<" ";
	}
	cout<<"\n";
	for(int i=1,j=m;j<=n;i++,j++)
	{
		cout<<sum1(1,i,j)<<" ";
	}
	return 0;
}

2025/2/2 13:46
加载中...