poj 2823 Sliding Window 线段树 读入挂

版权声明: https://blog.csdn.net/nwpu2017300135/article/details/81707665

http://poj.org/problem?id=2823

题解:直接用线段树会超时,我又加了个读入挂水过了……权当记录读入挂了

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1000005;
int Min[N<<2];
int Max[N<<2];
int cnt;
int Max_ans[N];
int Min_ans[N];
inline int max(int a,int b) { return a>b?a:b ; }
inline int min(int a,int b) { return a<b?a:b ; }
int read()
{
        char in;bool IsN=false;
        int num;
        in=getchar();
        while(in!='-'&&(in<'0'||in>'9')) in=getchar();
        if(in=='-'){ IsN=true;num=0;}
        else num=in-'0';
        while(in=getchar(),in>='0'&&in<='9'){
                num*=10,num+=in-'0';
        }
        if(IsN) num=-num;
        return num;
}
void write(int x) {
    if(x<0){
	putchar('-');
	x=-x;
    }
    int y = 10, len = 1;
    while (y <= x) {
        y *= 10;
        len++;
    }
    while (len--) {
        y /= 10;
        putchar(x / y + 48);
        x %= y;
    }
}
void push_up(int rt)
{
    Min[rt]=min(Min[rt<<1],Min[rt<<1|1]);
    Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
void build(int l,int r,int rt)
{
    if(l==r)
    {
        Max[rt]=read();
        Min[rt]=Max[rt];
        return ;
    }
    int m=(l+r)>>1;
    build(l,m,rt<<1);
    build(m+1,r,rt<<1|1);
    push_up(rt);
}
int  query_min(int l,int r,int rt,int L,int R)
{
    int ans=1e8;
    if(L<=l&&R>=r)
    {
        return Min[rt];
    }
    int m=(l+r)>>1;
    if(L<=m)
        ans=min(ans,query_min(l,m,rt<<1,L,R));
    if(R>m)
        ans=min(ans,query_min(m+1,r,rt<<1|1,L,R));
    return ans;
}
int query_max(int l,int r,int rt,int L,int R)
{
    int ans=-1e8;
    if(L<=l&&R>=r)
    {
        return Max[rt];
    }
    int m=(l+r)>>1;
    if(L<=m)
        ans=max(ans,query_max(l,m,rt<<1,L,R));
    if(R>m)
        ans=max(ans,query_max(m+1,r,rt<<1|1,L,R));
    return ans;
}
int main()
{
	int n,k;
	n=read();
	k=read();
        build(1,n,1);
        for(int i=1;i+k-1<=n;i++)
        {
            Max_ans[cnt]=query_max(1,n,1,i,i+k-1);
            Min_ans[cnt]=query_min(1,n,1,i,i+k-1);
            cnt++;
        }
        for(int i=0;i<cnt;i++)
	{
	    write(Min_ans[i]);
	    putchar(' ');
	}
        putchar('\n');
        for(int i=0;i<cnt;i++)
	{
		write(Max_ans[i]);
		putchar(' ');
	}
        putchar('\n');
        return 0;

}

猜你喜欢

转载自blog.csdn.net/nwpu2017300135/article/details/81707665