RNGVirus @ 2019-10-04 17:02:32
#include<cstdio>
#include<climits>
#define N 100002
struct tree{
int L,R;
int mid(){return (L+R)>>1;}
int maxv,minv;
}node[N<<3];
int n,k,maxv=INT_MIN,minv=INT_MAX;
int maxn[N<<2],minn[N<<2],cnt;
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
void creat(int root,int l,int r)
{
node[root].L=l;
node[root].R=r;
node[root].maxv=maxv;
node[root].minv=minv;
if(l!=r){
creat(root<<1,l,(l+r)>>1);
creat(root<<1|1,((l+r)>>1)+1,r);
}
return;
}
void insert(int root,int i,int v)
{
if(node[root].L==i&&node[root].R==i){
node[root].maxv=node[root].minv=v;
return;
}
node[root].maxv=max(node[root].maxv,v);
node[root].minv=min(node[root].minv,v);
if(i<=node[root].mid())
insert(root<<1,i,v);
else
insert(root<<1|1,i,v);
return;
}
void visit(int root,int l,int r)
{
if(node[root].minv>=minv&&node[root].maxv<=maxv)
return;
if(node[root].L==l&&node[root].R==r){
minv=min(minv,node[root].minv);
maxv=max(maxv,node[root].maxv);
return;
}
if(r<=node[root].mid())
visit(root<<1,l,r);
else if(l>node[root].mid())
visit(root<<1|1,l,r);
else{
visit(root<<1,l,node[root].mid());
visit(root<<1|1,node[root].mid()+1,r);
}
return;
}
int main()
{
int i,x;
scanf("%d%d",&n,&k);
creat(1,1,n);
for(i=1;i<=n;i++){
scanf("%d",&x);
insert(1,i,x);
}
for(i=1;i<=n-k+1;i++){
minv=INT_MAX;
maxv=INT_MIN;
visit(1,i,i+k-1);
maxn[++cnt]=maxv;
minn[cnt]=minv;
}
for(i=1;i<=cnt;i++)
printf("%d ",minn[i]);
printf("\n");
for(i=1;i<=cnt;i++)
printf("%d ",maxn[i]);
return 0;
}
就这么写的,剩下的死活RE不了,改数组大小也没用,萌新求大神指明道路。
by CreeperLordVader @ 2019-10-04 17:04:57
死活RE不了是什么意思。。。
这题要线性做法,线段树放弃吧
by Infinity_shl @ 2019-10-04 17:05:41
线段树跑1e6肯定不行啊
by Infinity_shl @ 2019-10-04 17:06:18
而且您的N是1e5
by RNGVirus @ 2019-10-04 17:51:29
@NOIP2018 我的,我的,眼瞎了
by RNGVirus @ 2019-10-04 17:55:08
@CreeperLordVader 第一次写帖子,手误,应该是“死活给我RE”,另外,看了@NOIP2018大神的回复后改成了1e6,居然A了。
by RNGVirus @ 2019-10-04 17:56:36