社区讨论
线段树50分TLE求助
P1886【模板】单调队列 / 滑动窗口参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lobv9qde
- 此快照首次捕获于
- 2023/10/30 03:31 2 年前
- 此快照最后确认于
- 2023/11/04 08:33 2 年前
快读莫名30分TLE。。。
CPP#include <bits/stdc++.h>
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
struct ST
{
int l,r,dat;
}a[4000005];
int t[1000005],n;
void build(int p,int l,int r,int b)
{
a[p].l=l;
a[p].r=r;
if(l==r)
{
a[p].dat=t[l];
return ;
}
int mid=(l+r)/2;
build(p*2,l,mid,b);
build(p*2+1,mid+1,r,b);
if(b==1) a[p].dat=max(a[p*2].dat,a[p*2+1].dat);
if(b==0) a[p].dat=min(a[p*2].dat,a[p*2+1].dat);
}
int ask(int p,int l,int r,int b)
{
if(l<=a[p].l&&r>=a[p].r) return a[p].dat;
int mid=(a[p].l+a[p].r)/2,maxn=-1<<30,minn=1<<30;
if(b==1)
{
if(l<=mid) maxn=max(ask(p*2,l,r,b),maxn);
if(r>mid) maxn=max(ask(p*2+1,l,r,b),maxn);
return maxn;
}
if(b==0)
{
if(l<=mid) minn=min(ask(p*2,l,r,b),minn);
if(r>mid) minn=min(ask(p*2+1,l,r,b),minn);
return minn;
}
}
int main()
{
int i,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&t[i]);
build(1,1,n,0);
for(i=1;i<=n-m+1;i++) printf("%d ",ask(1,i,i+m-1,0));
printf("\n");
build(1,1,n,1);
for(i=1;i<=n-m+1;i++) printf("%d ",ask(1,i,i+m-1,1));
printf("\n");
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...