CF 295A - Greg and Array 差分數列
一维的差分数列如下定义:
假设原数组为a[1]...a[n],a[0] = 0
差分数列数组为d[1]...d[n]
则d[i] = a[i]-a[i-1] (d数组初始化)
題目:
給出原始數列a[1]...a[n]
給出m個操作方式:
l r val
表示把a[l],...,a[r]都增加val
現在需要執行以下op條操作:
x y
表示執行第x條操作方式到第y條操作方式
詢問:最終的數列a
分析:
一:線段樹
顯然可以用線段樹成段更新。
1.對於每個操作,我們可以用樹狀數組、線段樹、差分數列,統計一下每條操作方式的次數c[i]
2.統計完之後對於每個操作方式進行成段更新,l_i r_i val_i*c[i]
3.遞歸一次得到所有節點的值。
二:樹狀數組
樹狀數組,跟線段樹差不多。。。
三:差分數列
1.由於是每個操作都是成段進行對成段的更新。
所以我們先對所有的操作用差分數列來統計一下每條操作方式執行的次數。
2.統計出每條操作方式的次數后,對於每個操作方式進行又一次的差分操作。
3.統計完之後直接加上原數列的大小即為答案
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;typedef long long ll;
typedef unsigned long long ull;#define lx(x) (x<<1)
#define rx(x) (x<<1|1)
#define debug puts("here")
#define rep(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define foreach(i,vec) for(unsigned i=0;i<vec.size();i++)
#define pb push_back
#define RD(n) scanf("%d",&n)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)/******** program ********************/const int MAXN = 1e5+5;int tmp[3][MAXN],a[MAXN];
ll ans[MAXN],t[MAXN];int main(){#ifndef ONLINE_JUDGEfreopen("sum.in","r",stdin);//freopen("sum.out","w",stdout);
#endifint n,m,op;while(~RD3(n,m,op)){rep1(i,n)RD(a[i]);memset(ans,0,sizeof(ans));memset(t,0,sizeof(t));rep1(i,m)RD3(tmp[0][i],tmp[1][i],tmp[2][i]);int x,y,z;while(op--){ /// 對於操作,統計出每條操作方式執行的次數RD2(x,y); // mans[y+1] --;ans[x] ++;}rep1(i,m) /// 大小為m(我這裡WA了3次 = =。)ans[i] += ans[i-1];rep1(i,m){ /// 對於每條操作方式,進行又一次的差分操作x = tmp[0][i];y = tmp[1][i];z = tmp[2][i];ll qq = ll(z)*ans[i];t[y+1] -= qq;t[x] += qq;}rep1(i,n) /// 統計t[i] += t[i-1];rep1(i,n)cout<<t[i]+a[i]<<" ";cout<<endl;}return 0;
}
转载于:https://www.cnblogs.com/yejinru/archive/2013/04/17/3026701.html
CF 295A - Greg and Array 差分數列相关推荐
- Codeforces 295A. Greg and Array
题目链接:http://codeforces.com/problemset/problem/295/A 题意: 给你一个含有 n 个数的数组, 以及 m 个形如 ( l, r, v) 的操作,代表 ...
- oracle报错无效列类型,jooq oracle存储过程与ARRAY,无效列类型:1111
我想在Oracle中使用JOOQ调用存储过程.存储过程的某些输入和输出参数是自定义类型.jooq oracle存储过程与ARRAY,无效列类型:1111 其中之一的定义是: CREATE OR REP ...
- 求和计算机教案,數列求和教案.doc
數列求和教案 攻略<数学> 教师:向茂华 Page PAGE 3 of NUMPAGES 4 地址:肇嘉浜路91号 电话数列求和的方法 1.公式法: 如果一个数列是等差.等比数列或者是可以 ...
- 編程之美2.9:神奇的菲波那契數列
只要是聽說過遞歸,學過一點數據結構的人都聽過這個數列.其實高二數學課上也有,不過那時候我還在受馬克思主義的薰陶,不知編程爲何物.好了,據說這個數列源於一對繁殖能力特別驚人的兔子. 其實這個就是一個遞推 ...
- Greg and Array CodeForces - 296C(差分数组+线段树)
Greg has an array a = a1, a2, -, an and m operations. Each operation looks as: li, ri, di, (1 ≤ li ≤ ...
- numpy array 增加一列(行)
使用Python的numpy的array结构,如何给矩阵增加一行或者一列呢? 下面提供一种方法,当然numpy还提供了很多API函数可供选择.
- java 不死神兔原理,java之不死神兔(斐波那契數列)
public class RabbitTest { public static void main(String[] args) { // 方法1 int[] array = new int[20]; ...
- flink sql 使用Table Function或Array Expansion 实现列转行(附源码实现)
1 需求 在使用flink sql处理数据时,经常会遇到一列转多行的需求.如将下面消息中转化为三条记录 {"name":"张三峰","urls&quo ...
- cf B. Wilbur and Array
Wilbur the pig is tinkering with arrays again. He has the array a1, a2, ..., an initially consisting ...
最新文章
- linux项目课程设计,LINUX课程设计项目需求解析.doc
- php 中margin-top,css margin-top属性怎么用
- Scala 类型的类型(一)
- 【STM32】RTC程序示例
- Educational Codeforces Round 75 (Rated for Div. 2) D. Salary Changing 二分 + check
- 索引 | ggplot2基础语法系列推文汇总
- java 基本数据类型及自动类型转换
- angularjs html标签,jquery – 如何使用AngularJS获取和设置HTML标签的属性值?
- GO语言开发天天生鲜项目第四天 商品后台管理
- NumPy下载与安装
- 看阮一峰es6摘抄的笔记
- Android渐变折线图,自定义View之颜色渐变折线图
- 示波器的主要功能 示波器作用介绍
- Pygame实战:下五子棋吗?信不信我让你几步你也赢不了?
- 网点分布图怎么做,用地图制作客户分布图
- .net 3des 解密
- Android最佳实践之性能 - 电池续航时间优化
- JAVA算法(四平方和)
- 广电为什么禁止投屏_广电的机顶盒怎么投屏
- java中的BIO基础-4