hdu5086——Revenge of Segment Tree
Revenge of Segment Tree
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 383 Accepted Submission(s): 163
cannot be modified once the structure is built. A similar data structure is the interval tree.
A segment tree for a set I of n intervals uses O(n log n) storage and can be built in O(n log n) time. Segment trees support searching for all the intervals that contain a query point in O(log n + k), k being the number of retrieved intervals or segments.
---Wikipedia
Today, Segment Tree takes revenge on you. As Segment Tree can answer the sum query of a interval sequence easily, your task is calculating the sum of the sum of all continuous sub-sequences of a given number sequence.
Each test case begins with an integer N, indicating the length of the sequence. Then N integer Ai follows, indicating the sequence.
[Technical Specification]
1. 1 <= T <= 10
2. 1 <= N <= 447 000
3. 0 <= Ai <= 1 000 000 000
2
1
2
3
1 2 3
2
20HintFor the second test case, all continuous sub-sequences are [1], [2], [3], [1, 2], [2, 3] and [1, 2, 3]. So the sum of the sum of the sub-sequences is 1 + 2 + 3 + 3 + 5 + 6 = 20.
Huge input, faster I/O method is recommended. And as N is rather big, too straightforward algorithm (for example, O(N^2)) will lead Time Limit Exceeded.
And one more little helpful hint, be careful about the overflow of int.
pid=5089" target="_blank">5089
pid=5088" target="_blank">5088
5085 5084 5082显然枚举全部区间是不可能的,我们得找找规律什么的,能够发现,设全部数的和是sum, S1(区间长度为1)的是sum,S2 = 2 * sum - (a1 + an)
S3 = 3 * sum - (2 * a1 + a2 + 2 *an + a1)
再枚举几个就能够找到规律
所以,总的和里。从左往右看 a1出现了(n-1)*n/2次,a2是(n - 2)*(n - 1)/2次........................
从右往左看,an出现了(n-1)*n/2次,an-1是(n - 2)*(n - 1)/2次........................
所以在O(n)的时间里就完毕了计算。注意用__int64以及取模
#include <map>
#include <set>
#include <list>
#include <stack>
#include <queue>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; __int64 a[447100];
__int64 b[447100];
const __int64 mod = 1000000007; int main()
{
int t, n;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
__int64 ans = 0, x;
__int64 sum = 0;
for (int i = 1; i <= n; i++)
{
scanf("%I64d", &x);
b[i] = x;
a[i] = (__int64)(n - i) * (1 + n - i) / 2 % mod;
sum += x;
sum %= mod;
}
for (int i = 1; i <= n; i++)
{
a[i] = (__int64)a[i] * b[i] % mod;
}
for (int i = n; i >= 1; i--)
{
a[i] += (__int64)(i - 1) * i / 2 % mod * b[i] % mod;
}
ans = (__int64) n * (n + 1) / 2 % mod * sum % mod;
for (int i = 1; i <= n; i++)
{
ans -= a[i];
ans %= mod;
if (ans < 0)
{
ans += mod;
}
ans %= mod;
}
printf("%I64d\n", ans);
}
return 0;
}
hdu5086——Revenge of Segment Tree的更多相关文章
- HDU5086——Revenge of Segment Tree(BestCoder Round #16)
Revenge of Segment Tree Problem DescriptionIn computer science, a segment tree is a tree data struct ...
- HDU5086:Revenge of Segment Tree(规律题)
http://acm.hdu.edu.cn/showproblem.php?pid=5086 #include <iostream> #include <stdio.h> #i ...
- hdu 5086 Revenge of Segment Tree(BestCoder Round #16)
Revenge of Segment Tree Time Limit: 4000/20 ...
- [ACM] HDU 5086 Revenge of Segment Tree(全部连续区间的和)
Revenge of Segment Tree Problem Description In computer science, a segment tree is a tree data struc ...
- HUD 5086 Revenge of Segment Tree(递推)
http://acm.hdu.edu.cn/showproblem.php?pid=5086 题目大意: 给定一个序列,求这个序列的子序列的和,再求所有子序列总和,这些子序列是连续的.去题目给的第二组 ...
- BestCoder#16 A-Revenge of Segment Tree
Revenge of Segment Tree Problem Description In computer science, a segment tree is a tree data struc ...
- [LintCode] Segment Tree Build II 建立线段树之二
The structure of Segment Tree is a binary tree which each node has two attributes startand end denot ...
- [LintCode] Segment Tree Build 建立线段树
The structure of Segment Tree is a binary tree which each node has two attributes start and end deno ...
- Segment Tree Modify
For a Maximum Segment Tree, which each node has an extra value max to store the maximum value in thi ...
随机推荐
- 什么时候需要交换Top Level ?
什么时候需要交换Top Level ? 上一篇中提到,如果采用仿真的时候,运用门级仿真就需要进行顶层交换,RTL仿真不需要,那么什么时候需要呢? QuartusII 向下包含,在Project Nav ...
- 用4bit的counter看同步复位与异步复位
先看看这个同步复位 //date: 2013/8/20 //designer :pengxiaoen module counter_4 ( clock,reset, out ); input rese ...
- C#实现时间戳转化
/// <summary> /// 时间戳转为C#格式时间 /// </summary> /// <param name=”timeStamp”></para ...
- RAR压缩解压命令
RAR压缩解压命令 这几天一直没空更新博客,现在补上: 先介绍一下rar的命令格式及相关参数含义(摘自rar): 用法: rar <命令> -<开关 1> -<开关 ...
- 17.1 Replication Configuration
17.1 Replication Configuration 17.1.1 How to Set Up Replication 17.1.2 Replication Formats 17.1.3 Re ...
- linux路由表配置
一.原理说明 1.路由表(table)从0到255进行编号,每个编号可以对应一个别名,编号和别名的对应关系在linux下放在/etc/iproute2/rt_tables这个文件里,一般0编号的tab ...
- C Primer Plus 读书笔记之C基础回顾
目标代码文件.可执行文件和库 C编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含可以运行的机器语言代码.C分两步完成这一工作:编译和链接.编译器将源代码转换为中间代码,链接器将此中间代 ...
- js两个日期对比大小
//适合格式(0000-00-00) //日期比较 function dateCompare(startdata, enddata) { var arr = startdata.split(&quo ...
- 关于C++异常机制的笔记(SEH, try-catch)
昨天晚上加班解决了一个问题,是由于无法正确的捕获到异常导致的.刚开始用try-catch,但是没法捕获到异常:后面改成SEH异常才解决.因此今天将这个问题重新梳理了一遍,关于try-catch, SE ...
- ※数据结构※→☆线性表结构(list)☆============单向循环链表结构(list circular single)(四)
循环链表是另一种形式的链式存贮结构.它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环. 单循环链表——在单链表中,将终端结点的指针域NULL改为指向表头结点或开始结点即可. 循环链表的 ...