P1886滑动窗口0分求助
  • 板块学术版
  • 楼主_luo_gu
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/8/22 15:01
  • 上次更新2023/11/3 01:59:37
查看原帖
P1886滑动窗口0分求助
950927
_luo_gu楼主2023/8/22 15:01
#include <bits/stdc++.h>
#define int long long
using namespace std ;
int n , k , que[100010] , ma[100010] , mi[10010] , l , r , a[100010];
int macnt = 1 ;
int micnt = 1 ;
//左侧标记大于i-k+1则在滑窗内  
signed main(){
	cin >> n >> k ;
	l = 1 ;
	r = 1 ;
	int cnt = 0 ;
	for( int i = 1 ; i <= n ; i ++ ){
//		cout<<"i_for:"<<i<<endl;
		cnt ++ ;
//		cout <<" test_cnt:"<<cnt << endl;
		cin >> a[i] ;
//		cout <<" read:"<<a[i]<<endl;
		if( l == r ){
//			cout<<" when the left mark = the right mark :"<<endl;
			que[r] = i ;
//			cout<<" que[r] :"<<a[que[r]]<<endl;
			r ++ ;
//			cout <<" right mark :"<<r<<endl;
//			cout <<" que[l]:"<<que[l]<<endl;
		}else{
			bool mark = false ;
//			cout<<" when que[r] <= a[i] :"<<endl;
			while( a[que[r]] < a[i] && r > l ){
//				cout <<"  r : "<<r<<" l:"<<l;
				r -- ;
				mark = true ;
			}
//			cout<<" get out of the while "<<endl;
//			cout<<" r:"<< r <<endl;
			if( mark == false ){
				r ++ ;
//				cout << " r:"<<r<<endl;
				que[r] = i ;
//				cout <<" que[r]:"<<a[que[r]]<<endl;
			}else{
				que [r] = i ;
//				cout <<" que[r]:" << a[que[r]] << endl;
				r ++ ;
//				cout << " r:"<<r<<endl;
			}
			if( cnt >= k ){
//				cout <<" when the cnt >= k :"<<endl;
				ma[macnt] = que[l] ;
				macnt ++ ;
//				cout <<" ma[l]"<<i<<endl;
				if( i - k + 1 > l ){
					l ++ ;
				}
//				cout<<" left mark:"<<l << endl;
			}
		}
	}
	l = 1 ; r = 1 ;
	cnt = 0 ;
	memset ( que , 0 , sizeof(que));
	for( int i = 1 ; i <= n ; i ++ ){
		cnt ++ ;
		if( l == r ){
			que[r] = i ;
			r ++ ;
		}else{
			bool mark = false ;
			while( a[que[r]] > a[i] && r > l ){
				r -- ;
				mark = true ;
			}
			if( mark == false ){
				r ++ ;
				que[r] = i ;
			}else{
				que[r] = i ;
				r ++ ;
			}
			if( cnt >= k ){
				mi[micnt] = que[l];
				micnt++;
				if( i - k + 1 >l){
					l ++ ;
				}
			}
		}
	}
	for( int i =1 ; i <= n - k + 1; i ++  ){
		cout << a[mi[i] ]<<" ";
	}
	cout << endl;
	for( int i = 1 ; i <= n - k + 1  ; i ++ ){
		cout << a[ma[i] ]<<" ";
	}
	cout << endl;
	return 0 ;
}
2023/8/22 15:01
加载中...