二分解法用cin会t。。。。。。。。。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<iostream>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define eps 1e-9
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
struct node{
int index,da;//da是保质期,index是下标,用于输出答案
}s[1000005],f[1000005];
int n,m,k;
int cmp(node u,node v)
{
return u.da>v.da;
}
int judge(int x)
{
int i,j,today,t;
i=n,j=x,t=0,today=0;
while(i>0&&j>0)
{
if(t==k)
{
t=0;
today++;
}
t++;
if(f[i].da<s[j].da) //先喝保质期小的
{
if(f[i].da>=today)
{
i--;
}
else if(s[j].da>=today)
{
j--;
}
else
{
return 0;
}
}
else
{
if(s[j].da>=today)
{
j--;
}
else if(f[i].da>=today)
{
i--;
}
else
{
return 0;
}
}
}
while(i>0) //家里的没喝完是情况
{
if(t==k)
{
t=0;
today++;
}
t++;
if(f[i].da<today)
{
return 0;
}
i--;
}
while(j>0) //买的没喝完
{
if(t==k)
{
t=0;
today++;
}
t++;
if(s[j].da<today)
{
return 0;
}
j--;
}
return 1;
}
int main()
{
int today,flog,t,i,j,le,ri,mid;
scanf("%d %d %d",&n,&m,&k);
for(i=1;i<=n;i++)
{
scanf("%d",&f[i].da);
f[i].index=i;
}
for(i=1;i<=m;i++)
{
scanf("%d",&s[i].da);
s[i].index=i;
}
sort(s+1,s+m+1,cmp);
sort(f+1,f+n+1,cmp);
today=0,flog=1,t=0; //先贪心判断家里的能不能喝完
for(i=n;i>0;i--)
{
t++;
if(f[i].da<today)
{
flog=0;
break;
}
if(t==k)
{
t=0;
today++;
}
}
if(!flog)
{
printf("-1\n");
}
else
{
le=0,ri=m;
while(le<ri)
{
mid=(le+ri)>>1;
if(judge(mid))
{
le=mid+1;
}
else
{
ri=mid-1;
}
}
for(j=le+1;j>=le-1;j--)
{
if(j>m)
continue;
if(judge(j))
{
printf("%d\n",j);
for(i=1;i<=j;i++)
printf("%d ",s[i].index);
break;
}
}
}
return 0;
}