我看错题,以为 B 对于每个加绝对值后一定是个排列然后就对了
查看原帖
我看错题,以为 B 对于每个加绝对值后一定是个排列然后就对了
297515
double_zero楼主2023/9/6 20:16

我不会证,题解也没有。

#include <bits/stdc++.h>
//#define int long long
#define pb push_back
using namespace std;
const int N=(int)(1e5+5);
vector<int>vec[N];
int n,a[N],ans[N];

void clr() {
	for(int i=0;i<=n;i++) vector<int>().swap(vec[i]);
}

void sol() {
	cin>>n;
	clr();
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) vec[a[i]].pb(i);
	int res=0;
	for(int i=n;i>=1;i--) {
		int d1=res+i,d2=res;
		if(!vec[d2].empty()) {
			int qwq=vec[d2].back();
			ans[qwq]=-i;
			vec[d2].pop_back();
		} else if(!vec[d1].empty()) {
			int qwq=vec[d1].back();
			ans[qwq]=i;
			vec[d1].pop_back();
			++res;
		} else {
			cout<<"NO\n"; return ;
		}
	}
	cout<<"YES\n";
	for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
	cout<<'\n';
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	int T; cin>>T; while(T--) sol();
	return 0;
}
2023/9/6 20:16
加载中...