| ||||||||||
| 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 | |||||||||
Re:贴个傻逼线段树!!!In Reply To:贴个傻逼线段树!!! Posted by:wocha at 2012-08-15 10:24:19 /*
ID:songskg
PROB:zkw-supertree
LANG:C++
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int M=1048576;
const int max_=1<<29;
typedef struct
{
int min,max;
}node;
node tree[M*2];
int n,k;
int query_max(int s,int t)
{
int ans=-max_;
for (s+=M-1,t+=M+1; s^t^1; s>>=1,t>>=1)
{
if (~s&1) ans=max(ans,tree[s^1].max);
if (t&1) ans=max(ans,tree[t^1].max);
}
return ans;
}
int query_min(int s,int t)
{
int ans=max_;
for (s+=M-1,t+=M+1; s^t^1; s>>=1,t>>=1)
{
if (~s&1) ans=min(ans,tree[s^1].min);
if (t&1) ans=min(ans,tree[t^1].min);
}
return ans;
}
void init()
{
scanf("%d %d",&n,&k);
for (int i=1; i<=n; ++i)
{
scanf("%d",&tree[M+i].max);
tree[M+i].min=tree[M+i].max;
}
for (int i=M-1; i>=1; --i)
{
tree[i].min=min(tree[i*2].min,tree[i*2+1].min);
tree[i].max=max(tree[i*2].max,tree[i*2+1].max);
}
for (int i=1; i<=n-k+1; ++i)
printf("%d ",query_min(i,i+k-1));
printf("\n");
for (int i=1; i<=n-k+1; ++i)
printf("%d ",query_max(i,i+k-1));
printf("\n");
}
int main()
{
init();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator