玲珑acm 倍增

来源:互联网 发布:人工智能对社会 编辑:程序博客网 时间:2024/06/03 22:59

地址:http://www.ifrog.cc/acm/problem/1112

官方题解很详细:

这里就不做过多的解释了,注意一下long long就可以了和倍增超过最大限度就好了

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;#define LL long longLL 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;}


0 0
原创粉丝点击