第i题好像有问题,大部分人都没过
部分人先判断有没有长度为k的不上升字串
如果有,不变
没有就直接排序最后k个元素,这样过不了,5,3 3 2 3 2 1
很多人跑出了3 2 1 2 3,正确的是3 2 2 3 1
看了第一名的代码启发,可以处理重复数据,用了multiset
#include <bits/stdc++.h> using namespace std; #define ll long long bitset<200005> able; int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,k; cin>>n>>k; int arr[n]; for(auto &i:arr)cin>>i; if(k == 1){ for(auto &i:arr)cout<<i<<' '; return 0; } int len = 1; for(int i = 1;i<n;i++){ if(arr[i]>arr[i-1])len++; else len = 1; if(len>=k){ for(auto &j:arr)cout<<j<<' ';cout<<'\n'; return 0; } } multiset<int> st; for(int i = 0;i<k;i++)st.insert(arr[n-1-i]); int p = n-k; for(int i = n-k-1;i>=0;i--){ st.extract(arr[i+k]); //for(auto &j:st)cout<<j<<' '; if(arr[i]<=*st.begin())p = i; //可以从这个点开始排 //cout << "i = " << i << " p = " << p << endl; if(arr[i]>=arr[i+1])break; // 从i开始排序更有性价比 st.insert(arr[i]); } //cout << p << endl; sort(arr+p,arr+p+k); for(auto &i:arr)cout<<i<<' '; return 0; }