版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/define_danmu_primer/article/details/53114508
##题意
不可描述
##思路
二分答案,贪心判断
##代码
/* ********************************
Author : danmu
Created Time : 2016年11月10日 星期四 10时19分02秒
File Name : a.cpp
******************************** */
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
#include <list>
#include <map>
#include <set>
#define rep(i,x,y) for(int i=x;i<=y;++i)
#define _rep(i,x,y) for(int i=x;i>=y;--i)
#define CL(S,x) memset(S,x,sizeof(S))
#define CP (S1,S2) memcpy(S1,S2,sizeof(S2))
#define ALL(x,S) for(x=S.begin();x!=S.end();++x)
#define ULL unsigned long long
#define PI 3.1415926535
#define INF 0x3f3f3f3f
#define LL long long
const int maxn = 1e5;
const int mod = 1e9 + 7;
const double eps = 1e-8;
using namespace std;
int a[maxn+5],b[maxn+5];
bool flag[maxn+5];
int n,m;
bool judge(int x){
LL tmp=0;
memset(flag,0,sizeof flag);
for(int i=x;i>=1;--i){
if(b[i]&&!flag[b[i]]){
tmp+=a[b[i]];
flag[b[i]]=true;
}
else if(tmp>0) --tmp;
}
for(int i=1;i<=m;++i)
if(!flag[i])
return false;
printf("%d %lld\n",x,tmp);
if(tmp>0) return false;
return true;
}
int main(){
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int l,r,mid;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",b+i);
for(int i=1;i<=m;++i)
scanf("%d",a+i);
l=0,r=n+1;
while(r-l>1){
mid=(l+r)>>1;
if(judge(mid))
r=mid;
else
l=mid;
}
printf("%d\n",r==n+1?-1:r);
return 0;
}