奇怪的膜法(magic)——前缀和做法

题目描述

Zxyer是M国一个伟大的膜法师,现在他制作出了n个膜法球,每个膜法球有一个初始膜力值,由亍zxyer现在在修炼膜法,因此zxyer现在会对这些按照编号为1~n顺序依次排列的膜法球进行m次操作,每次zxyer会将一个区间的膜法球拿出,然后将他们的膜力值依次增加一个等差数列,现在zxyer想要知道在他施法全部结束后,这些膜法球各自的膜力值。

输入

第一行2个整数,n,m,定义参见问题描述。

第2行n个整数,ai,表示膜法球各自的初始膜力值。

第3~m+2行,每行3个整数,Li,Ri,qi,si表示第i次操作区间的左右端点(对应着等差数列的首项与末项),等差数列的公差,首项。

输出

输出n行,每行1个整数,表示施法结束后每个膜法球的膜力值。

样例输入

5 4
1 2 3 4 5
1 3 2 1
4 5 -1 2
1 5 -3 10
2 4 6 -5

样例输出

12
7
13
14
4

提示

对于100%的数据,1≤n,m≤200000

来源

20170416 NOIP模拟赛 by zxyer

这是学长出的一道题。

暴力的做法就只能拿部分分,其实我们大多数人也只有部分分。

线段树的做法就O(nlogn)就可以过了,不过还有更快的O(n+m)的方法。

简单的说就是两次前缀和。

因为题意要求在区间内加上一个差分序列,告诉公差。

我们假设公差是1,那么在前缀和数组a上修改就是a[l]到a[r]加每一位都加1。

因此可以用线段树做。

然而没有多次查询,我们就可以再来一个数组a的前缀和数组b,在b[l]上加1,在b[r]上减1。就可以实现a[l]到a[r]加每一位都加1。

然后就大功告成了。

注意,会爆int。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const long long maxn=200010;
long long read(){
    long long t=1,num=0;
    char c=getchar();
    while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();}
    return num*t;
}
long long a[maxn],b[maxn]={0},c[maxn]={0},ans[maxn]={0};
long long n,m,l,r,q,s;
int main()
{
    n=read();m=read();
    for(long long i=1;i<=n;i++)a[i]=read();
    for(long long i=1;i<=m;i++){
        l=read();r=read();q=read();s=read();
        c[l+1]+=q;c[r+1]-=q;
        long long g=(r-l)*q;
        c[l]+=s;c[l+1]-=s;
        c[r+1]-=g+s;c[r+2]+=g+s;
    }
    for(long long i=1;i<=n;i++)b[i]=b[i-1]+c[i];
    for(long long i=1;i<=n;i++)ans[i]=ans[i-1]+b[i];
    for(long long i=1;i<=n;i++)cout<<a[i]+ans[i]<<"\n";
    return 0;
}

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

时间: 2024-10-13 19:12:33

奇怪的膜法(magic)——前缀和做法的相关文章

【OpenJudge3531】【背包DP】【膜法交配律】判断整除

判断整除 总时间限制: 1000ms 内存限制: 65536kB [描述] 一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和.比如序列:1.2.4共有8种可能的序列:(+1) + (+2) + (+4) = 7(+1) + (+2) + (-4) = -1(+1) + (-2) + (+4) = 3(+1) + (-2) + (-4) = -5(-1) + (+2) + (+4) = 5(-1) + (+2) + (-4) = -3(-1) + (-2) + (+4) = 1(-

[luogu3767]膜法

[luogu3767]膜法 luogu 神仙题 线段树分治+带权并查集 把每个操作看成点 首先这个操作的结构是一棵树 你发现每个点的对它的子树产生影响 我们可以想到用dfn序把它转成一段区间用线段树分治来做 但是还有删除操作,相当于在一个大区间里面挖掉几个小区间 可以对每个操作开一个vector记录区间搞一搞 然后带权并查集是模5意义下的,可以认为给你的操作相当于从u连向v的一条权值为1或2的边 当u,v在同一个集合时,判断是否满足条件,否则就连边 #define pb push_back #d

cogs1685 膜法森林 神奇的SPFA

继续填坑--链接:http://cogs.pro/cogs/problem/problem.php?pid=1685 题意:两种费用,求出两种费用最小的和. 正解是$LCT$--但是这里有一个令人惊掉下巴的做法-- 不断枚举每一条边所需的第一种费用,对于满足这一条件下的边加入图中,同时压入队列,随后跑最短路,跑出一次更新一次最小值-- 恩就这么做出来了-- 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring&g

dedecms(织梦)表前缀的bug

    表前缀的做法很科学,当一个数据库中的存在多个项目时,而项目之间必定会存在相同命名的表,这时候给项目加上表前缀是很有必要的,所以我们应该习惯给项目里的表加表前缀.     通常我们设置表前缀是把表前缀做成一个配置.在程序中我们会把该表前缀加到sql语句的表名前.但是在程序中的具体操作有很多方式.     目前我看到了2种关于把表前缀加到sql语句中的做法:     1.dedecms     在写sql语句的时候不考虑表前缀的问题,在所有表的前面都加上同样的字符串(#@__),然后在sql

hdu Phone List 字典树的前缀判断

题链:http://acm.hdu.edu.cn/showproblem.php?pid=1671 Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12763    Accepted Submission(s): 4341 Problem Description Given a list of phone numb

项目期复习总结:背景图合并,hack,浏览器内核前缀,伪类after before

目录: 1.背景图合并和CSS Spirit 2.PS基本快捷键 3.hack技术基本书写,为什么不用? 4.内核前缀 5.伪类afterbefore 1.背景图合并和CSS Spirit 背景图合并在使用时有两种方法: ①一种就是你会PS,可以自己PS实现背景图合并成一张图片,再用background-position实现背景图的定位. ②如果你不会PS,那可以用CSS背景图合并工具,直接选好图片后在线制作生成相对应格式的图片,方便快捷. background的语法: background-c

windows编程笔记(3):匈牙记命名法

本文讲一下匈牙利命名法: 举两个例子:hInstance,szCmdLine. 这两个例子中,第一个变量的h表示handle,代表这个变量是一个句柄:第二个变量的sz表示这个变量是以0结尾的字符串,也就是C语言中,传统的字符串. 匈牙利命名法就是这样的,以一个表示这个变量类型的字母组合来表示这个变量的类型.其后的单词代表它的变量的意思. 匈牙利命名法的前缀表如下所示: 还有一种命名方法,假如要命名一个结构体,例如上一个程序中的WNDCLASS这个结构体,变量可以叫wndclass.RECT-->

项目期复习总结1:背景图合并,hack,浏览器内核前缀,伪类after before

文件夹: 1.背景图合并和CSS Spirit 2.PS基本快捷键 3.hack技术基本书写,为什么不用? 4.内核前缀 5.伪类afterbefore 1.背景图合并和CSS Spirit 背景图合并在使用时有两种方法: ①一种就是你会PS.能够自己PS实现背景图合并成一张图片.再用background-position实现背景图的定位. ②假设你不会PS.那能够用CSS背景图合并工具,直接选好图片后在线制作生成相相应格式的图片.方便快捷. background的语法: background-

拉链法解决hashtable冲突问题

拉链法解决冲突.拉链法解决冲突的做法是将所有的相同Hash值的key放在一个链表中,比如key3和key14在hash之后都是0,那么在数组的键为0的地方存储这两个值,形式是链表.如果不能理解我的文字,请看下面的示例,看一下打印信息就明白了.拉链法是什么,就是链表. class HashNode{ public $key; public $value; public $nextNode; public function __construct($key, $value, $nextNode=Nu