线段树60分

P1886 滑动窗口 /【模板】单调队列

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

谢谢大神们相助


|