P13786 题解
DaiRuiChen007 · · 题解
Problem Link
首先假设
通过
首先
然后考虑
考虑
那么直接运用之,
注意到我们只要取出三个排列中值为
那么只要考虑
否则
那么我们就给出了所有
时间复杂度
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=2e5+5;
void solve() {
ll n,a,b,c,ty,m;
cin>>n>>a>>b>>c>>ty,m=n;
if(a*b*c<n||a+b>c+n||a+c>b+n||b+c>a+n) return cout<<"No\n",void();
cout<<"Yes\n";
if(!ty) return ;
int k=0;
for(;n&&(a-1)*(b-1)*(c-1)>=n-1;++k,--a,--b,--c,--n);
basic_string <int> B,C;
if(!n);
else if(a+b+c-2>n) {
for(int i=n-1;~i;--i) B+=i,C+=i;
swap(B[0],B[1]),swap(C[1],C[2]);
} else {
map <ll,int> X;
vector <array<ll,2>> Y,Z;
auto ins=[&](ll x) { X[x]=0,Y.push_back({-(x/a),x}),Z.push_back({x/a/c,-x}); };
ins(0);
for(int i=1;i<a;++i) ins(i);
for(int i=1;i<b;++i) ins(a*c*i);
for(int i=1;i<c;++i) ins(a*i);
for(int i=0;i<n&&(int)X.size()<n;++i) if(!X.count(i)) ins(i);
sort(Y.begin(),Y.end()),sort(Z.begin(),Z.end());
int t=0;
for(auto &o:X) o.second=t++;
for(auto o:Y) B+=X[o[1]];
for(auto o:Z) C+=X[-o[1]];
}
for(int i=n;i<m;++i) B+=i,C+=i;
for(int i=0;i<m;++i) cout<<i+1<<" \n"[i==m-1];
for(int i=0;i<m;++i) cout<<B[i]+1<<" \n"[i==m-1];
for(int i=0;i<m;++i) cout<<C[i]+1<<" \n"[i==m-1];
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int _; cin>>_;
while(_--) solve();
return 0;
}