地址:http://www.ifrog.cc/acm/problem/1112
官方題解很詳細:
這裏就不做過多的解釋了,注意一下long long就可以了和倍增超過最大限度就好了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define LL long long
LL arr[300005];
LL v[300005];
LL tarr[300005];
bool cmp(LL a, LL b)
{
return a < b;
}
bool isFuck(int s, int e,LL k)
{
int tail = 0;
for (int i = s;i <= e;i++)
tarr[++tail] = arr[i];
sort(tarr+1, tarr + tail+1, cmp);
LL ans = 0;
for (int i = 1;i <= tail;i++)
{
ans += tarr[i] * v[i];
if (ans > k)
{
return true;
}
}
return false;
}
int _find(int s,int l, int r, LL k)
{
while (l <= r)
{
int mid = (l + r) / 2;
if (isFuck(s, mid,k) == false)
l = mid + 1;
else
{
r = mid - 1;
}
}
return l;
}
int anspos[300005];
int main()
{
int q;
LL k;
while (scanf("%d%lld", &q, &k) != EOF)
{
for(int i = 0;i<=q;i++)anspos[i] = 0;
for (int i = 1;i <= q;i++)
{
scanf("%lld", &arr[i]);
}
for (int i = 1;i <= q;i++)
scanf("%lld", &v[i]);
int ans = 0;
int pos = 1;
int anstail = 0;
while (pos <= q)
{
int tpos = 1;
int lastpos = 0;
while (tpos+pos <= q && isFuck(pos, pos+tpos, k) == false)
{
lastpos = tpos;
tpos *= 2;
}
if (tpos+pos > q)tpos = q-pos;
//cout << lastpos << "+" << tpos << endl;
int bigpos = _find(pos, pos+lastpos, pos+tpos, k);
// cout << pos << "-" << bigpos << "-" << tpos << "-" << lastpos << endl;
if (bigpos <= q)
{
pos = bigpos + 1;
ans++;
anspos[bigpos] = ans;
}
else
{
break;
}
}
for(int i = 1;i<=q;i++)
{
anspos[i] = max(anspos[i-1],anspos[i]);
if(i!=1)printf(" ");
printf("%d",anspos[i]);
}
printf("\n");
}
return 0;
}