【玲珑杯 Round#13 B】 【倍增+二分】
来源:互联网 发布:mac os x 10.11.4 dmg 编辑:程序博客网 时间:2024/06/01 07:34
传送门:
http://www.ifrog.cc/acm/problem/1112?contest=1015&no=1
题意:
定义一个序列的混乱度为累加和:b[i]*v[i],b[i]为这个序列中第i小的数,v[]数组是给定的。如果当前加进来的数购车的数构成的序列的混乱度大于m,则将当前的序列扔掉,然后将变量C加一,现在给出要加进来的序列的顺序,和v[]数组,求最终C的值。
思路:
枚举左端点,二分右端点,暴力判断混乱度与M的关系,如果M为0,只能一个一个删除,那么二分貌似会将复杂度拉高,所以为了避免这种情况我们要用倍增算法确定二分区间,假设当前左端点为i,于是枚举一个k使得[i,i+2^k]刚好大于M,于是,我们要改变C的位置必定在[i+2^(k-1),i+2^k]内,然后对这个区间二分暴力判断。
代码:
#include <set>#include <map>#include <queue>#include <vector>#include <math.h>#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;#define ff first#define ss second#define pb push_back#define ll long long#define mod 1000000007#define ull unsigned long long#define mst(ss,b) memset(ss,b,sizeof(ss));#define pl(x) cout << #x << "= " << x << endl;const int inf = 0x3f3f3f3f;const int N = 1e6+5;int n, num[N];ll m, a[N], b[N], v[N];bool check(int l, int r){ int len = 0; ll sum = 0; for(int i=l; i<=r; i++)b[++len] = a[i]; sort(b+1, b+1+len); for(int i=1; i<=len; i++){ sum += b[i]*v[i]; if(sum > m)return 1; } return 0;}int main(){ //先倍增找大于m的区间,然后再二分找 while(~scanf("%d%lld", &n, &m)){ for(int i=1; i<=n; i++)scanf("%lld", &a[i]); for(int i=1; i<=n; i++)scanf("%lld", &v[i]); int cnt = 0; for(int i=1; i<=n; i++){ int k; for(k=1; k+i<=n; k*=2)if(check(i, i+k))break; //k肯定多一些 int l = i+k/2, r = i+k, ans = r; //ans要赋初值 while(l <= r){ //找大于m int mid = (l+r)>>1; if(check(i, mid))r = mid-1, ans = mid; else l = mid+1; } for( ; i<=ans; i++){ if(i == ans){ num[i] = ++cnt; break; } num[i] = cnt; } } for(int i=1; i<=n; i++)printf("%d%c", num[i], i==n?'\n':' '); } return 0;}
0 0
- 【玲珑杯 Round#13 B】 【倍增+二分】
- 二分+倍增思想 “玲珑杯”ACM比赛 Round #13/B
- “玲珑杯”ACM比赛 Round #13 B -- 我也不是B,倍增+二分!
- “玲珑杯”ACM比赛 Round #19 B.Buildings【二分+RMQ】
- 玲珑杯-1112 (倍增+二分)
- 玲珑杯#round13 我也不是B(倍增+二分查找)
- 玲珑杯-Round #7.B-1072-Capture
- 玲珑杯round#19B 1149 Buildings
- “玲珑杯”ACM比赛 Round #4 B Best couple
- “玲珑杯”ACM比赛 Round #13
- “玲珑杯”Round #11
- 玲珑杯 Round #20
- 倍增二分——玲珑学院OJ #1112
- 玲珑杯 #round 9 1084
- 玲珑杯round#11 ----A
- 玲珑杯round #18 1147
- 玲珑杯 Round 19 1152
- 玲珑杯”ACM比赛 Round #15 D 咸鱼商店【二分+01背包】
- 【C语言】*++p,*p++,++*p,++*++p,++*p++
- 团体程序设计天梯赛L2-018 多项式A除以B
- 2017年2月中华人民共和国县以上行政区划代码
- js实现轮播图
- 面向对象设计原则(一)——单一职责原则
- 【玲珑杯 Round#13 B】 【倍增+二分】
- 图的基本操作
- 【C语言】指针小总结
- 安装SQL developer 64
- 最基础的事务 银行转账小事列
- 蓝牙地址问题
- PS试用期到期后怎么办
- 通过脚本学shell编程——相关基础知识之shell内置变量命令(更新中)
- 小白前端课堂