【51nod】区间求和
LYK在研究一个有趣的东西。
第一行一个整数n(1<=n<=1000000),接下来一行n个数ai(1<=ai<=1000000)表示LYK的序列。
一行表示答案。
5
3 4 5 5 3
2 题解:每次取出一个区间[l, r],发现a[i] 产生的贡献为 2*i-l-r. 预处理一下prenum[], presum[], prenum[i]表示[1, i]有多少个和a[i]相同, presum[i]表示[1, i]与a[i]相同的数所在的下标和,同理预处理出nexnum[], nexsum[].O(n)扫一遍维护一下l, r, 2*i即可递推出各个值。
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h> using namespace std;
#define ll unsigned long long
const int N = 1e6+;
int n, a[N];
int pre[N], nex[N], pos[N];
int prenum[N], nexnum[N];
int presum[N], nexsum[N];
int fl[N], fr[N], f[N]; int main(){
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", a+i); memset(pos, , sizeof(pos));
for(int i = ; i <= n; i++){
pre[i] = pos[ a[i] ];
prenum[i] = prenum[ pre[i] ]+;//前面的个数
presum[i] = presum[ pre[i] ]+i;//前面的下标和
pos[ a[i] ] = i;
}
memset(pos, , sizeof(pos));
for(int i = n; i; i--){
nex[i] = pos[ a[i] ];
nexnum[i] = nexnum[ nex[i] ]+;
nexsum[i] = nexsum[ nex[i] ]+i;
pos[ a[i] ] = i;
} for(int i = ; i <= n; i++){
fl[i] = fl[i-];
fl[i] += i*nexnum[i];
fl[i] -= presum[i-];
}
for(int i = n; i; i--){
fr[i] = fr[i+];
fr[i] += i*prenum[i];
fr[i] -= nexsum[i+];
} for(int i = ; i <= n; i++)
f[i] = f[i-]+nexnum[i]-prenum[i-];
unsigned int ans = ;
for(int i = ; i <= n; i++){
//printf("i %d: %d %d %d\n", i, fl[i], fr[i], f[i]);
ans += a[i]*(*i*f[i]-fl[i]-fr[i]);
}
printf("%u\n", ans);
return ;
}
【51nod】区间求和的更多相关文章
- POJ 2823 Sliding Window 线段树区间求和问题
题目链接 线段树区间求和问题,维护一个最大值一个最小值即可,线段树要用C++交才能过. 注意这道题不是求三个数的最大值最小值,是求k个的. 本题数据量较大,不能用N建树,用n建树. 还有一种做法是单调 ...
- POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...
- vijos1740 聪明的质监员 (二分、区间求和)
http://www.rqnoj.cn/problem/657 https://www.vijos.org/p/1740 P1740聪明的质检员 请登录后递交 标签:NOIP提高组2011[显示标签] ...
- LightOJ 1112 Curious Robin Hood (单点更新+区间求和)
http://lightoj.com/volume_showproblem.php?problem=1112 题目大意: 1 i 将第i个数值输出,并将第i个值清0 2 i v ...
- POJ 3468 A Simple Problem with Integers(线段树区间求和)
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- poj3468 A Simple Problem with Integers(线段树模板 功能:区间增减,区间求和)
转载请注明出处:http://blog.csdn.net/u012860063 Description You have N integers, A1, A2, ... , AN. You need ...
- poj3468树状数组的区间更新,区间求和
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 47174 ...
- D 区间求和 [数学 树状数组]
D 区间求和 题意:求 \[ \sum_{k=1}^n \sum_{l=1}^{n-k+1} \sum_{r=l+k-1}^n 区间前k大值和 \] 比赛时因为被B卡了没有深入想这道题 结果B没做出来 ...
- [用CDQ分治解决区间加&区间求和]【习作】
[前言] 作为一个什么数据结构都不会只会CDQ分治和分块的蒟蒻,面对区间加&区间求和这么难的问题,怎么可能会写线段树呢 于是,用CDQ分治解决区间加&区间求和这篇习作应运而生 [Par ...
- 线段树 区间开方区间求和 & 区间赋值、加、查询
本文同步发表于 https://www.zybuluo.com/Gary-Ying/note/1288518 线段树的小应用 -- 维护区间开方区间求和 题目传送门 约定: sum(i,j) 表示区间 ...
随机推荐
- UWP学习开发笔记记录(开篇)
零零散散开发微软移动2年多了,基本上从未记录或写过任何笔记.所以打算写一些自己的心得和技术的分享,大家一起来共同探讨.虽然现在UWP的工作几乎没有了,但是我感觉大家都是在观望,再看接下来微软的动作,所 ...
- 5-Zend Studio配置
0-将文件编码设置成utf-8 Window>Preferences>General>Content Types>Text Default encoding:utf-8 1-Z ...
- 2.6 C#的数据转换
C#有多种数据类型,每种数据类型只能存储这种类型的变量,但又的时候我们需要各种类型之间的转换.比如在计算2+3.5的时候,这个时候有两种情况: 自动类型转换:2种不同类型的数据运算,低精度类型的数值会 ...
- Android Fragment应用实战
现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加入Fragment的时候,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题,但现在即使只是在手机上, ...
- SSH框架使用中存在的诡异异常
背景 相信大多数人目前都在使用Spring + Struts2/SpringMVC + Hibernate来构建项目的整体架构,但是在使用中经藏会遇到一些诡异的问题,不知道如果解决,今天我遇到了一个非 ...
- C#调用WebService (转)
1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...
- Java未被捕获的异常该怎么处理
在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式.class Exc0 { public static void ...
- SSIS变量属性中EvaluateAsExpression设置的作用
我们在做SqlServer SSIS包开发的时候,经常会用到SSIS的变量,我们可以使用和修改SSIS变量的值使得SSIS包的逻辑更灵活,如下图所示: 在定义SSIS变量的时候可以使用固定值(如上图中 ...
- HTML5 input placeholder 颜色修改
在开发中遇到的一个小问题,记录下来./*placehodel*/ input:-ms-input-placeholder{color:#a9a9a9;}/* Internet Explorer 10+ ...
- Solr5 DataImport 处理1对多关系
“问题” 和“派发处理” 是2个对象. 每个问题可以被派发N次, 最后结束问题. 实际查询中数据量可能很大,同时即可以从问题查派发部门, 也可以从派发情况查询问题(如本部门处理的问题) 使用的技巧就是 ...