博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【题解】我也不是B ifrog 1112 二分 倍增
阅读量:6367 次
发布时间:2019-06-23

本文共 1564 字,大约阅读时间需要 5 分钟。

题目传送门:http://ifrog.cc/acm/problem/1112

神奇的倍增二分,长见识了,在此做个记录,分享给大家。

懒得写题解了,直接转YJQ的:http://ifrog.cc/acm/solution/18

另外,这个复杂度的证明我不是很懂,只会自己瞎脑补的不严谨的证明,如果哪位神犇会,还请教教我qwq。

代码:

1 #include 
2 #include
3 #include
4 5 using namespace std; 6 typedef long long ll; 7 const int MAXN = 300010; 8 9 int n;10 ll m, a[MAXN], v[MAXN];11 int ans[MAXN] = {
0};12 13 ll tmp[MAXN];14 bool check( int begin, int end ) { // 区间混乱度大于m返回true15 for( int i = begin; i < end; ++i ) tmp[i] = a[i];16 sort(tmp+begin, tmp+end);17 ll sum = 0;18 for( int i = begin; i < end; ++i )19 sum += tmp[i] * v[i-begin];20 return sum > m;21 }22 23 int main() {24 scanf( "%d%lld", &n, &m );25 for( int i = 0; i < n; ++i ) scanf( "%lld", a+i );26 for( int i = 0; i < n; ++i ) scanf( "%lld", v+i );27 for( int i = 0; i < n; ) {28 int k;29 for( k = 1; i+k <= n; k <<= 1 ) // 倍增,左闭右开区间30 if( check(i,i+k) ) break;31 k = min(k, n-i);32 int low = i+(k>>1), high = i+k;33 while( low < high ) { // 二分34 int mid = (low+high)>>1;35 if( check(i,mid) ) high = mid;36 else low = mid+1;37 }38 if( check(i,low) ) ans[low-1] = 1;39 i = low;40 // printf( "low = %d\n", low );41 }42 for( int i = 0; i < n; ++i ) {43 if(i) ans[i] += ans[i-1], putchar(' ');44 printf( "%d", ans[i] );45 }46 puts("");47 return 0;48 }

 

转载于:https://www.cnblogs.com/mlystdcall/p/6656871.html

你可能感兴趣的文章
用java代码编写Oracle存储过程
查看>>
APACHE转发
查看>>
android-market-api
查看>>
解決 yum update錯誤:[Errno -1] Metadata file does not match checksum
查看>>
ASP.NET(C#)Excel导入Dataset的出现数据值丢失问题
查看>>
我的友情链接
查看>>
『Data Science』R语言学习笔记,获取数据
查看>>
rails中n秒页面自动跳转
查看>>
我的友情链接
查看>>
忘记root用户密码怎么办?
查看>>
esxi定时任务
查看>>
Scaffold-DbContext
查看>>
关于VMware Workstation主机列表问题求教
查看>>
配置管理小报101021:给ubuntu加监控
查看>>
qml文字滚动效果的封装,实现方式运用的qml中提供的动画效果,另一种实现方式也可以使用定时器修改控件的坐标来实现...
查看>>
标准C++实现任务队列
查看>>
jdbc url
查看>>
刷leetcode第704题-二分查找
查看>>
debug_backtrace() 函数生成一个 backtrace(追踪)
查看>>
第七天,还是盒子
查看>>