离散化+树状数组找第k小元素
SBT又超时了,真搞不明白..
#include
<
iostream
>
#include < algorithm >
using namespace std;
#define MAXN 1000001
int a[MAXN],c[MAXN],mx[MAXN],mxcnt,n,m;
struct Node{
int num,tag;
}nod[MAXN];
class CP{
public :
int operator ()(Node a,Node b){
return a.num < b.num;
}
};
void prep(){
mxcnt = 0 ;
memset(c, 0 , sizeof (c));
int i;
for (i = 1 ;i <= n;i ++ ){
scanf( " %d " , & nod[i].num);
nod[i].tag = i;
}
sort(nod + 1 ,nod + n + 1 ,CP());
for (i = 1 ;i <= n;i ++ )
a[nod[i].tag] = i;
}
inline int lowbit( int x){
return x & ( - x);
}
void insert( int x, int t){
while (x <= n){
c[x] += t;
x += lowbit(x);
}
}
int findk( int k){
int cnt = 0 ,ans = 0 ;
for ( int i = 20 ;i >= 0 ;i -- ){ // i from log2(n) to 0
ans += ( 1 << i);
if (ans >= n || cnt + c[ans] >= k)ans -= ( 1 << i);
else cnt += c[ans];
}
return ans + 1 ;
}
int main(){
int i;
while (scanf( " %d%d " , & n, & m) != EOF){
prep();
for (i = 1 ;i <= m;i ++ )
insert(a[i], 1 );
printf( " %d " ,nod[findk( 1 )].num);
mx[mxcnt ++ ] = nod[findk(m)].num;
for (i = 1 ;i <= n - m;i ++ ){
insert(a[i], - 1 );
insert(a[i + m], 1 );
printf( " %d " ,nod[findk( 1 )].num);
mx[mxcnt ++ ] = nod[findk(m)].num;
}
printf( " \n " );
printf( " %d " ,mx[ 0 ]);
for (i = 1 ;i < mxcnt;i ++ )
printf( " %d " ,mx[i]);
printf( " \n " );
}
return 0 ;
}
#include < algorithm >
using namespace std;
#define MAXN 1000001
int a[MAXN],c[MAXN],mx[MAXN],mxcnt,n,m;
struct Node{
int num,tag;
}nod[MAXN];
class CP{
public :
int operator ()(Node a,Node b){
return a.num < b.num;
}
};
void prep(){
mxcnt = 0 ;
memset(c, 0 , sizeof (c));
int i;
for (i = 1 ;i <= n;i ++ ){
scanf( " %d " , & nod[i].num);
nod[i].tag = i;
}
sort(nod + 1 ,nod + n + 1 ,CP());
for (i = 1 ;i <= n;i ++ )
a[nod[i].tag] = i;
}
inline int lowbit( int x){
return x & ( - x);
}
void insert( int x, int t){
while (x <= n){
c[x] += t;
x += lowbit(x);
}
}
int findk( int k){
int cnt = 0 ,ans = 0 ;
for ( int i = 20 ;i >= 0 ;i -- ){ // i from log2(n) to 0
ans += ( 1 << i);
if (ans >= n || cnt + c[ans] >= k)ans -= ( 1 << i);
else cnt += c[ans];
}
return ans + 1 ;
}
int main(){
int i;
while (scanf( " %d%d " , & n, & m) != EOF){
prep();
for (i = 1 ;i <= m;i ++ )
insert(a[i], 1 );
printf( " %d " ,nod[findk( 1 )].num);
mx[mxcnt ++ ] = nod[findk(m)].num;
for (i = 1 ;i <= n - m;i ++ ){
insert(a[i], - 1 );
insert(a[i + m], 1 );
printf( " %d " ,nod[findk( 1 )].num);
mx[mxcnt ++ ] = nod[findk(m)].num;
}
printf( " \n " );
printf( " %d " ,mx[ 0 ]);
for (i = 1 ;i < mxcnt;i ++ )
printf( " %d " ,mx[i]);
printf( " \n " );
}
return 0 ;
}