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;
}