建图:
0为源点
n+m+1为汇点
0连1~n一条单位人数的边
n+1~n+m连m+n+1一条圆桌承载人数的年
1~n连n+1~n+m一条为1的边
然后跑dinic模板
#include<bits/stdc++.h>
using namespace std;
int n,m;
int r[100005];
int c[100005];
struct oppo {
int to,s,nex;
} rod[100005];
int head[100005],tot=1;
void add(int from,int to,int s) {
rod[++tot].to=to;
rod[tot].nex=head[from];
rod[tot].s=s;
head[from]=tot;
}
queue< int > v;
int d[100005];
int cur[100005];
bool bfs() {
memset(d,-1,sizeof(d));
d[0]=1;
cur[0]=head[0];
v.push(0);
while(v.size()) {
int lxl=v.front();
v.pop();
for(int i=head[lxl]; i; i=rod[i].nex) {
int to=rod[i].to;
if(rod[i].s&&d[to]==-1) {
d[to]=d[lxl]+1;
cur[to]=head[to];
v.push(to);
}
}
}
return d[n+m+1]!=-1;
}
int find(int x,int lowt) {
if(x==n+m+1) return lowt;
int low=0;
for(int i=cur[x]; i&&low<lowt; i=rod[i].nex) {
cur[x]=i;
int to=rod[i].to;
if(rod[i].s&&d[to]==d[x]+1) {
int k=find(to,min(lowt-low,rod[i].s));
if(!k) d[to]=-1;
low+=k;
rod[i].s-=k;
rod[i^1].s+=k;
}
}
return low;
}
int dinic() {
int ans=0,r;
while(bfs())
while(r=find(0,1e8))
ans+=r;
return ans;
}
int all;
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++) {
scanf("%d",&r[i]);
all+=r[i];
add(0,i,r[i]);
add(i,0,0);
}
for(int i=n+1; i<=n+m; i++) {
scanf("%d",&c[i]);
add(i,n+m+1,c[i]);
add(n+m+1,i,0);
}
for(int i=1; i<=n; i++)
for(int j=n+1; j<=n+m; j++) {
add(i,j,1);
add(j,i,0);
}
if(dinic()==all) {
puts("1");
for(int i=1; i<=n; i++) {
for(int j=head[i]; j; j=rod[j].nex)
if(rod[j].s==0)
cout<<rod[j].to-n<<" ";
cout<<"\n";
}
} else
puts("0");
return 0;
}