B. Negative Prefixes(貪心,構造)

Kurihada發表於2020-10-01
題目傳送門

Negative Prefixes

題目大意

給你一個長度為n的陣列a,每個數字對應一個0或者1,為0即為可以移動,你可以任意移動對應為0的數字
使得字首和陣列p的最大值所在的位置最小
輸出移動後的陣列

思路

為使得字首和的最大值儘可能的早出現,所以我們需要將可以移動的值中大的值儘可能的往前放
即為將可以移動的位置的值按非遞增的方式培訓然後插入不可移動中

AC Code

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
#define endl '\n'
#define INF 0x3f3f3f3f
#define int long long
#define debug(a) cout<<#a<<"="<<a<<endl;
// #define TDS_ACM_LOCAL
const int N=2e5 +9;
int n, a[N], flag[N];
int b[N];
void solve(){
    cin>>n;
    memset(b,0,sizeof(b));
    int k=0;
    for(int i=1; i<=n; i++) cin>>a[i];
    for(int i=1; i<=n; i++){
        cin>>flag[i];
        if(flag[i]==0){
            b[++k]=a[i];
        }
    }
    sort(b+1, b+1+k);
    for(int i=1; i<=n; i++){
        if(flag[i]==1)  cout<<a[i]<<" ";
        else            cout<<b[k--]<<" ";
    }
    cout<<endl;
    return ;
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
#ifdef TDS_ACM_LOCAL
    freopen("D:\\VS code\\.vscode\\testall\\in.txt", "r", stdin);
    freopen("D:\\VS code\\.vscode\\testall\\out.txt", "w", stdout);
#endif
    int T;
    cin>>T;
    while(T--)  solve();
    return 0;
}

相關文章