| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
请教大牛,我初学这个线段数,我的代码怎么wa掉了#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
struct TREE
{
int l, r, p;
int min,max;
}tree[4*1000000];
int data[1000005];
void build(int l, int r, int p)
{
tree[p].l=l;
tree[p].r=r;
if(l==r)
{
tree[p].min=tree[p].max=data[l];
return ;
}
int mid = (l+r)>>1;
build(l, mid, 2*p);
build(mid + 1, r, 2*p+1);
tree[p].min=min(tree[2*p].min,tree[2*p+1].min);
tree[p].max=max(tree[2*p].max,tree[2*p+1].max);
}
int minl[1000005],maxl[1000005];
void query(int l,int r,int& min,int& max,int p)
{
if(tree[p].l == l && tree[p].r == r)
{
min = tree[p].min;
max = tree[p].max;
return ;
}
int mid = (tree[p].l + tree[p].r)>>1;
if(mid >= r)
query(l,r,min,max,p*2);
else if(mid<l)
query(l,r,min,max,p*2+1);
else
{
int max2,min2;
query(l,mid,min,max,p*2);
query(mid+1,r,min2,max2,p*2+1);
min=min<min2?min:min2;
max=max>max2?max:max2;
}
}
int main()
{
int n,k;
int i;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&data[i]);
build(1,n,1);
int maxt,mint;
for(i=1;i<=n-k+1;i++)
{
query(i,i+k-1,mint,maxt,1);
minl[i]=mint;
maxl[i]=maxt;
}
for(i=1;i<=n-k;i++)
printf("%d ",minl[i]);
printf("%d\n",minl[i]);
for(i=1;i<=n-k;i++)
printf("%d ",maxl[i]);
printf("%d\n",maxl[i]);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator