UESTC_秋实大哥与花 2015 UESTC Training for Data Structures<Problem B>
B - 秋实大哥与花
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
秋实大哥是一个儒雅之人,昼听笙歌夜醉眠,若非月下即花前。
所以秋实大哥精心照料了很多花朵。现在所有的花朵排成了一行,每朵花有一个愉悦值。
秋实大哥每天要对着某一段连续的花朵歌唱,然后这些花朵的愉悦值都会增加一个相同的值v(v可能为负)。
同时他想知道每次他唱完歌后这一段连续的花朵的愉悦值总和是多少。
Input
第一行有一个整数n,表示花朵的总数目。
第二行包含n个整数ai,表示第i朵花初始的愉悦值。
第三行包含一个整数m,表示秋实大哥唱了m天的歌。
接下来m行,每行包含三个整数l r v,表示秋实大哥对着[l,r]这个区间内的花朵歌唱,每朵花的愉悦值增加了v。
1≤n,m,ai,|v|≤100000,1≤l≤r≤n。
Output
输出共m行,第i行表示秋实大哥完成第i天的歌唱后,那一段花朵的愉悦值总和。
Sample input and output
Sample Input | Sample Output |
---|---|
3 |
2 |
解题报告:
没啥好说的,线段树模板基础题。。唯一需要注意的就是long long了.
当然我是使用的树状数组:
题目中操作属于区间更新 - 区间查询<查询点也是区间嘛>类型,可使用树状数组来实现.
令C[i]为从1至i号花的共同更新之和.
首先考虑更新,add[l,r,v] → c[r] += v , c[l-1] -=v;
Sum[x] = 从 1 至 x 号花的value之和.
Sum[x] = c[1]*1 + c[2]*2 + c[3] * 3 ..... + c[x] * x + (c[x+1] + .... C[n] ) *x;
= (segema)f(x) + (segema)g(x) * x;
= 两个树状数组,一个维护 c[i]*i ,一个维护c[i]
之后考虑区间查询:
Query(l , r)
= sum[r] - sum[l-1]
#include <iostream>
#include <cstring>
typedef long long ll;
using namespace std;
const int maxn = 1e5 + ;
ll n;
ll f[maxn],g[maxn]; inline ll lowbit(ll idx)
{
return idx & (-idx);
} void updataf(ll idx,ll res)
{
if (!idx)
return;
while(idx <= n)
{
f[idx] += res;
idx += lowbit(idx);
}
} void updatag(ll idx,ll res)
{
if (!idx)
return;
while(idx <= n)
{
g[idx] += res;
idx += lowbit(idx);
}
} ll sumf(ll idx)
{
ll res = ;
while(idx > )
{
res += f[idx];
idx -= lowbit(idx);
}
return res;
} ll sumg(ll idx)
{
ll res = ;
while(idx > )
{
res += g[idx];
idx -= lowbit(idx);
}
return res;
} int main(int argc,char *argv[])
{
ll m;
scanf("%lld%lld",&n,&m);
memset(f,,sizeof(f));
memset(g,,sizeof(g));
for(int j = ; j <= n ; ++ j)
{
ll v;
scanf("%lld",&v);
updataf(j,v*j);
updataf(j-,-v*(j-));
updatag(j,v);
updatag(j-,-v);
}
while(m--)
{
ll i,j,v;
scanf("%lld%lld%lld",&i,&j,&v);
updataf(j,v*j);
updataf(i-,-v*(i-));
updatag(j,v);
updatag(i-,-v);
i--;
ll res1 = sumf(i) + i*(sumg(n)-sumg(i));
ll res2 = sumf(j) + j*(sumg(n)-sumg(j));
printf("%lld\n",res2 - res1);
}
return ;
}
UESTC_秋实大哥与花 2015 UESTC Training for Data Structures<Problem B>的更多相关文章
- UESTC_秋实大哥搞算数 2015 UESTC Training for Data Structures<Problem N>
N - 秋实大哥搞算数 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Subm ...
- UESTC_秋实大哥打游戏 2015 UESTC Training for Data Structures<Problem H>
H - 秋实大哥打游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Subm ...
- UESTC_秋实大哥去打工 2015 UESTC Training for Data Structures<Problem G>
G - 秋实大哥去打工 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Subm ...
- UESTC_秋实大哥与家 2015 UESTC Training for Data Structures<Problem E>
E - 秋实大哥与家 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- UESTC_秋实大哥与战争 2015 UESTC Training for Data Structures<Problem D>
D - 秋实大哥与战争 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Subm ...
- UESTC_秋实大哥与快餐店 2015 UESTC Training for Data Structures<Problem C>
C - 秋实大哥与快餐店 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Sub ...
- UESTC_秋实大哥与小朋友 2015 UESTC Training for Data Structures<Problem A>
A - 秋实大哥与小朋友 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Sub ...
- UESTC_秋实大哥掰手指 2015 UESTC Training for Dynamic Programming<Problem B>
B - 秋实大哥掰手指 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 2048/1024KB (Java/Others) Submit ...
- UESTC_秋实大哥与线段树 2015 UESTC Training for Data Structures<Problem M>
M - 秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Sub ...
随机推荐
- 【剑指offer】面试题31:连续子数组的最大和
题目: 在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2, ...
- 修改Fedora 20 启动项
在Fedora 20里面,Fedora 使用了systemd作为系统与服务的管理工具,这个守护进程是系统开机后第一个开启的进程,pid 为1.systemd扮演着初始化系统的角色,主要用于开启与维护系 ...
- OpenWrt刷机
http://blog.163.com/l1_jun/blog/static/14386388201441344612/ http://blog.chinaunix.net/uid-25073805- ...
- JS中简单的this学习
我在学习JS初期,在使用this的时候经常出现问题,当然就是在现在,也有一些场景不能很好的明白this到底指代的是什么?看下面一个例子: var x = 10; var foo = { x ...
- 【转】Linux下socket keep alive讲解
[需求]不影响服务器处理的前提下,检测客户端程序是否被强制终了.[现状]服务器端和客户端的Socket都设定了keepalive属性.服务器端设定了探测次数等参数,客户端.服务器只是打开了keepal ...
- VMware+Ubuntu8.10+Skyeye+gdb实现u-boot源码调试
系统平台:WindowsXP 虚拟机: VMware Workstation 6.5.0 Ubuntu8.10 安装程序 ubuntu-8.10-desktop-i386.iso 下载地址:http: ...
- 基础总结篇之九:Intent应用详解
看似尋常最奇崛,成如容易卻艱辛.北宋.王安石 看似普通的事情其实最不同寻常,并不是简简单单就可以做好的:成功看起来似乎很容易,而成功的过程却充满着艰辛. 对于我们认为很普通的事情,不屑一顾,就永远不会 ...
- codeforces 166C Median - from lanshui_Yang
C. Median time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
- C库函数笔记
一.string.h 1.memcpy 函数原型:void *memcpy(void *dest, const void *src, size_t n); 功能:从源src所指的内存地址的起始位置开始 ...
- oracle函数Lpad与Rpad
函数介绍 lpad函数从左边对字符串使用指定的字符进行填充.从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思. 语法格式如下: lpad( string ...