hdu 5358(尺取法)
2015-08-09 11:02
267 查看
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define Max 100010 using namespace std; typedef long long LL; LL sum[Max]; LL p[50]; int n, con; void Init() { for(LL i = 1; i <= 1e10; i *= 2) p[con++] = i; p[con] = 1e10 + 1; p[0] = 0; } //尺取也能这样用Orz.....mark LL count(LL a, LL b) { //计算[a, b)的(i + j)和 int l, r; l = r = 0; LL ans = 0; for(int i = 1; i <= n; i++) { if(l < i) l = i; if(r < i) r = i; while(l <= n && sum[l] - sum[i - 1] < a) l++; while(r <= n && sum[r] - sum[i - 1] < b) r++; r--; if(l == n + 1 || r == i - 1) continue; ans += (LL)(r - l + 1) * i + (LL)(l + r) * (r - l + 1) / 2; } return ans; } int main() { Init(); int t; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%lld", &sum[i]); sum[i] += sum[i - 1]; } LL ans = 0; for(int i = 0; i < con; i++) { ans += (LL)(i + 1) * count(p[i], p[i + 1]); } printf("%lld\n", ans); } return 0; }
相关文章推荐
- 单例模式
- Hadoop之hive 其他
- SQL创建计算时间函数
- Unity武器系统的优化
- UVA-10061 How many zero's and how many digits ? (数论)
- imageView 的contentMode问题
- java数据类型讲解
- 判断数字中是否包含两个相同的子串 华为oj
- hdu 2119 Matrix(二分匹配)
- 程序员将是人类最后一个被人工智能代替的工作
- spring 定时器
- HDOJ066 一个人的旅行(dijkstra)
- shell简介
- 用记事本写一个简单的java程序
- 2015年8月9日11:01:08
- MCS #5 丧心病AK专场 AC题解
- u_boot启动过程中的具体分析(1)
- pos 和 AnsiPos
- 单一出口原则
- 产品健康度模型(4) 打分I