最后20可能用离散化搞一搞,鸽~
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int maxn=1010;
int tmp[maxn];
struct node{
int id;
int cnt;
int ke;
}q[maxn];
set<int> s[maxn];//存放应用
int n,m;//n个节点,m个可用区
bool cmp(node c,node d){
if(c.cnt==d.cnt){
return c.id<d.id;
}
else return c.cnt<d.cnt;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
q[i].id=i;
cin>>q[i].ke;
}
int g;
cin>>g;
for(int u=1;u<=g;u++){
int f,a,na,pa,paa,paar;
cin>>f>>a>>na>>pa>>paa>>paar;
if(na==0&&pa==0&&paa==0){
for(int i=1;i<=f;i++){
sort(q+1,q+n+1,cmp);
cout<<q[1].id<<' ';
q[1].cnt++;
s[q[1].id].insert(a);
}
puts("");
}
else{
if(na!=0&&pa==0&&paa==0){
for(int i=1;i<=f;i++){
sort(q+1,q+n+1,cmp);
int fl=0;
for(int j=1;j<=n;j++)
if(q[j].ke==na){
q[j].cnt++;
cout<<q[j].id<<' ';
s[q[j].id].insert(a);
fl=1;
break;
}
if(!fl) cout<<0<<' ';
}
puts("");
}
else if(pa==0){
if(paar==0){
memset(tmp,0,sizeof tmp);
for(int i=1;i<=f;i++){
sort(q+1,q+n+1,cmp);
for(int j=1;j<=n;j++)
if(((q[j].ke==na)||(na==0))&&s[q[j].id].count(paa)==0){
q[j].cnt++;
tmp[i]=q[j].id;
s[q[j].id].insert(a);
break;
}
}
int fl=0;
for(int i=1;i<=f;i++)
if(tmp[i]==0){
fl=1;
break;
}
if(!fl){
for(int i=1;i<=f;i++)
cout<<tmp[i]<<' ';
puts("");
continue;
}
for(int i=1;i<=f;i++)
if(!tmp[i]){
sort(q+1,q+n+1,cmp);
for(int j=1;j<=n;j++)
if((q[j].ke==na)||(na==0)){
q[j].cnt++;
tmp[i]=q[j].id;
s[q[j].id].insert(a);
break;
}
}
for(int i=1;i<=f;i++)
cout<<tmp[i]<<' ';
puts("");
}
else{//paar=1
int fl=0;
for(int i=1;i<=n;i++)
if(((q[i].ke==na)||(na==0))&&s[q[i].id].count(paa)==0){
fl=1;
break;
}
if(fl==0){
for(int i=1;i<=f;i++)
cout<<0<<' ';
puts("");
}
else{
memset(tmp,0,sizeof tmp);
for(int i=1;i<=f;i++){
sort(q+1,q+n+1,cmp);
for(int j=1;j<=n;j++)
if(((q[j].ke==na)||(na==0))&&s[q[j].id].count(paa)==0){
q[j].cnt++;
tmp[i]=q[j].id;
s[q[j].id].insert(a);
break;
}
}
for(int i=1;i<=f;i++)
cout<<tmp[i]<<' ';
puts("");
}
}
}
else{//pa=1
if(paar==0){
memset(tmp,0,sizeof tmp);
for(int i=1;i<=f;i++){
sort(q+1,q+n+1,cmp);
for(int j=1;j<=n;j++)
if(((q[j].ke==na)||(na==0))&&s[q[j].id].count(paa)==0&&s[q[j].id].count(pa)==1){
q[j].cnt++;
tmp[i]=q[j].id;
s[q[j].id].insert(a);
break;
}
}
int fl=0;
for(int i=1;i<=f;i++)
if(tmp[i]==0){
fl=1;
break;
}
if(!fl){
for(int i=1;i<=f;i++)
cout<<tmp[i]<<' ';
puts("");
continue;
}
for(int i=1;i<=f;i++)
if(!tmp[i]){
sort(q+1,q+n+1,cmp);
for(int j=1;j<=n;j++)
if(((q[j].ke==na)||(na==0))&&s[q[j].id].count(pa)==1){
q[j].cnt++;
tmp[i]=q[j].id;
s[q[j].id].insert(a);
break;
}
}
for(int i=1;i<=f;i++)
cout<<tmp[i]<<' ';
puts("");
}
else{//paar=1
int fl=0;
for(int i=1;i<=n;i++)
if(((q[i].ke==na)||(na==0))&&s[q[i].id].count(pa)==1&&s[q[i].id].count(paa)==0){
fl=1;
break;
}
if(fl==0){
for(int i=1;i<=f;i++)
cout<<0<<' ';
puts("");
}
else{
memset(tmp,0,sizeof tmp);
for(int i=1;i<=f;i++){
sort(q+1,q+n+1,cmp);
for(int j=1;j<=n;j++)
if(((q[j].ke==na)||(na==0))&&s[q[i].id].count(pa)==1&&s[q[j].id].count(paa)==0){
q[j].cnt++;
tmp[i]=q[j].id;
s[q[j].id].insert(a);
break;
}
}
for(int i=1;i<=f;i++)
cout<<tmp[i]<<' ';
puts("");
}
}
}
}
// printf("第%d组:\n",u);
// for(int i=1;i<=n;i++)
// printf("%3d",q[i].id);puts("");
// for(int i=1;i<=n;i++)
// printf("%3d",q[i].cnt);puts("");
// if(u==5||u==6){
// for(int i=1;i<=n;i++){
// cout<<q[i].id<<"id"<<endl;
// for(auto j:s[q[i].id])
// cout<<j<<' ';puts("");
// }
// }
}
}