2015 Multi-University Training Contest 6 hdu 5358 First One
2015-08-07 15:20
495 查看
First One
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 881 Accepted Submission(s): 273
soda has an integer array $a_1,a_2,\dots,a_n$. Let $S(i,j)$ be the sum of $a_i,a_i+1,\dots,a_j$. Now soda wants to know the value below:
\[\sum_{i = 1}^{n}\sum_{j = i}^{n}(\lfloor \log_{2}{S(i,j)} \rfloor + 1)\times (i+j) \]
Note: In this problem, you can consider $\log_{2}{0}$ as 0.
[align=left]Input[/align]
There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:
The first line contains an integer $n (1 \geq n \leq 10^5)$,the number of integers in the array.
The next line contains n integers $0 \leq a_{i} \leq 10^{5}$
[align=left]Output[/align]
For each test case, output the value.
[align=left]Sample Input[/align]
1
2
1 1
[align=left]Sample Output[/align]
12
[align=left]Source[/align]
2015 Multi-University Training Contest 6 F-1006
解题:这道题目有意思,我们可以发现 $a_{i} \leq 10^{5}$ 这是一个信息,破题的关键.
$\log_{2}{sum}$大概会在什么范围呢?sum最多是 $10^{5} \times 10^{5} = 10^{10}$
也就是说$\log_{2}{sum} \leq 34$
才35,sum的特点是什么?很明显都是非负数,那么sum必须是递增的,单调的,F-100. 我们可以固定$log_{2}{S(i,j)}$ 后 固定左区间j,找出以j作为左区间,然后当然是找出最小的r 和 最大的 R
最小 最大?当然是这样的区间,该区间的和取对数是我们刚刚固定的那个数。区间可以表示成这样 $[j,r\dots R]$ 那么从j到r,j到 r+1,...,j 到R ,这些区间的和取对数都会等于同一个数。。
好了如何算$[j,r\dots R]$ 的下标和?很明显吗。。j r,j r+1, j r+2,..., j R.把左区间下标一起算了,右区间是个等差数列,求和。
我们在最后把那个表达式里面的1加上
同样的计算方法
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 100010; LL p[38] = {1},sum[maxn]; void init() { for(int i = 1; i <= 36; ++i) p[i] = (p[i-1]<<1); } int main() { init(); int kase,n; scanf("%d",&kase); while(kase--){ scanf("%d",&n); for(int i = 1; i <= n; ++i){ scanf("%I64d",sum+i); sum[i] += sum[i-1]; } LL ret = 0; for(int i = 1; i <= 35 && p[i] <= sum ; ++i){ int L = 1,R = 0; LL tmp = 0; for(int j = 1; j <= n; ++j){ while(L <= n && sum[L] - sum[j-1] < p[i]) ++L; while(R + 1 <= n && sum[R + 1] - sum[j-1] < p[i+1]) ++R; if(L <= R) tmp += (LL)j*(R - L + 1) + 1LL*(L + R)*(R - L + 1)/2; } ret += tmp*i; } for(int i = 1; i <= n; ++i) ret += LL(n + i)*(n - i + 1)/2 + LL(i)*(n - i + 1); printf("%I64d\n",ret); } return 0; }
View Code
相关文章推荐
- 安卓 绑定service的aidl出现异常的解决
- MongoDB not authorized on admin to execute command --auth Authentication failed.
- hdu-5323-Solve this interesting problem(2015 Multi-University Training Contest 3)
- linux wait与waitpid函数的深入分析
- hud--4251The Famous ICPC Team Again+划分树入门题
- 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)
- Hdu 2015 Multi-University Training Contest6
- 解决服务器出现大量CLOSE_WAIT和TIME_WAIT连接的方法
- CLOSE_WAIT生成的原因
- 2015 Multi-University Training Contest 3
- 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)
- ERROR 1396 (HY000): Operation CREATE USER failed for 'root'@'localhost'
- 使用AIDL实现进程间的通信之复杂类型传递
- 使用AIDL实现进程间的通信
- http://www.sqlservercentral.com/articles/Failover+Clustered+Instance+(FCI)/92196/
- 人工智能领域的会议和期刊
- http://blog.csdn.net/luobin369/article/details/8537897
- (leetcode)Contains Duplicate II
- Failed to create the host-only adapte
- WAI-ARIA无障碍网页应用