GXU - 7D - 区间求和 - 前缀和

https://oj.gxu.edu.cn/contest/7/problem/D

描述
有一个所有元素皆为0的数组A,有两种操作:
1 l r x表示将A区间[l,r]内所有数加上x;
2 l r表示将A区间[l,r]内从左往右数第i个数加上i;

给出m个操作,请输出操作结束后A中的最大值。

输入
第一行一个整数m,表示操作的个数
接下来有m行,表示操作的内容,具体格式与题目中一致

0<=m<=10^6
1<=l<=r<=10^6
0<=x<=10^9

输出
输出一个整数,表示所有操作之后A中的最大值

思路,差分,难点在于三角形怎么处理。
其实也不难,计算一下有几个三角形在哪里出现又消失就可以了。当三角形消失的时候解除掉三角形对当前的影响就足够了。

首先对差分求前缀和可以复原原数组,这个简单。

那么对三角形数量差分求前缀和可以复原每个区间的三角形的数量。

发现每一个三角形会使得前缀和增加1,解除这个三角形的时候就要把它的贡献一并解除掉。显然贡献就是区间长。

所以这个数据结构可以叫做“LD三角形区间修改前缀和”

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;inline ll read() {ll x = 0;bool f = 0;char c;do {c = getchar();if(c == '-')f = 1;} while(c < '0' || c > '9');do {x = (x << 3) + (x << 1) + c - '0';c = getchar();} while(c >= '0' && c <= '9');return f ? -x : x;
}inline void _write(ll x) {if(x > 9)_write(x / 10);putchar(x % 10 + '0');
}inline void write(ll x) {if(x < 0) {putchar('-');x = -x;}_write(x);putchar('\n');
}/*---  ---*/const int MAXM = 1000000;
ll df1[MAXM+5];
int df2[MAXM+5];inline void update(int l, int r, ll v) {df1[l]+=v;df1[r+1]-=v;
}inline void update2(int l, int r) {df2[l]+=1;df2[r+1]-=1;df1[r+1]-=(r-l+1);
}inline ll calc() {ll ans=0;int curd=0;ll curs=0;for(int i=1;i<=MAXM;i++){curd+=df2[i];curs+=curd;curs+=df1[i];if(curs>ans)ans=curs;}return ans;
}int main() {
#ifdef Yinkufreopen("Yinku.in", "r", stdin);//freopen("Yinku.out","w",stdout);
#endif // Yinkuint m=read();while(m--){int op=read(),l=read(),r=read();if(op==1){int x=read();update(l,r,x);}else{update2(l,r);}}write(calc());
}

要是少一个数量级其实可以线段树:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;inline ll read() {ll x = 0;//int f = 0;char c;do {c = getchar();/*if(c == '-')f = 1;*/} while(c < '0' || c > '9');do {x = (x << 3) + (x << 1) + c - '0';c = getchar();} while(c >= '0' && c <= '9');//return f ? -x : x;return x;
}inline void _write(int x) {if(x > 9)_write(x / 10);putchar(x % 10 + '0');
}inline void write(int x) {if(x < 0) {putchar('-');x = -x;}_write(x);putchar('\n');
}/*---  ---*/const int MAXM = 1000000;
ll a[MAXM + 5];
ll lazy[(MAXM << 2) + 5];
int lazy2[(MAXM << 2) + 5];inline void push_down(int o, int l, int r) {if(lazy[o] || lazy2[o]) {lazy[o << 1] += lazy[o];lazy[o << 1 | 1] += lazy[o];int m = (l + r) >> 1;lazy2[o << 1] += lazy2[o];lazy2[o << 1 | 1] += lazy2[o];lazy[o << 1 | 1] += (m - l + 1) * lazy2[o];lazy[o] = 0;lazy2[o] = 0;}
}void build() {memset(a, 0, sizeof(a));memset(lazy, 0, sizeof(lazy));memset(lazy2, 0, sizeof(lazy2));
}void update(int o, int l, int r, int a, int b, ll v) {if(a <= l && r <= b) {lazy[o] += v;return;} else {push_down(o, l, r);int m = (l + r) >> 1;if(a <= m)update(o << 1, l, m, a, b, v);if(b >= m + 1)update(o << 1 | 1, m + 1, r, a, b, v);}
}void update2(int o, int l, int r, int a, int b, int h) {//这个区间底下包含一个高为h的矩形然后上面是一个三角形,最左侧恰好有h+1个方块if(a <= l && r <= b) {lazy[o] += h;lazy2[o]++;return;} else {push_down(o, l, r);int m = (l + r) >> 1;if(a <= m)update2(o << 1, l, m, a, b, h);//左侧底下方块是一样的if(b >= m + 1)update2(o << 1 | 1, m + 1, r, a, b, h + m - a + 1);//右侧多m-a+1个方块}
}void all_pushdown(int o, int l, int r) {if(l == r) {a[l] += lazy[o] + lazy2[o];} else {push_down(o, l, r);int m = (l + r) >> 1;all_pushdown(o << 1, l, m);all_pushdown(o << 1 | 1, m + 1, r);}
}int main() {
#ifdef Yinkufreopen("Yinku.in", "r", stdin);//freopen("Yinku.out","w",stdout);
#endif // Yinku//sieve();build();int m=read();while(m--){int op=read(),l=read(),r=read();if(op==1){int x=read();update(1,1,1000000,l,r,x);}else{update2(1,1,1000000,l,r,0);}}all_pushdown(1,1,1000000);ll maxans=a[1];for(int i=2;i<=1000000;i++){if(a[i]>maxans)maxans=a[i];}printf("%lld\n",maxans);
}

转载于:https://www.cnblogs.com/Yinku/p/11073411.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript-排序算法

插入排序 算法描述&#xff1a; 1. 从第一个元素开始&#xff0c;该元素可以认为已经被排序 2. 取出下一个元素&#xff0c;在已经排序的元素序列中从后向前扫描 3. 如果该元素&#xff08;已排序&#xff09;大于新元素&#xff0c;将该元素移到下一位置 4. 重复步骤 3&am…

DPDK并行计算

参考文献&#xff1a; 《深入浅出DPDK》 https://www.cnblogs.com/LubinLew/p/cpu_affinity.html ...................................................................... 前言&#xff1a; 处理器提高性能主要是通过两个途径&#xff0c;一个是提高IPC&#xff08;CPU每一时…

Highcharts图表-ajax-获取json数据生成图表

重点说明此代码是针对一个报表显示多个项对比显示。 直接贴代码&#xff1a;web端 <script type"text/JavaScript" src"js/jQuery/jquery-1.7.2.js"></script> <script type"text/javascript" src"j…

关于RGBDSLAMV2学习、安装、调试过程

Step&#xff11;&#xff1a;https://github.com/felixendres/rgbdslam_v2/wiki/Instructions-for-Compiling-Rgbdslam-(V2)-on-a-Fresh-Ubuntu-16.04-Install-(Ros-Kinetic)-in-Virtualbox 照着这个instructions安装好 rgbdslamv2&#xff0c;并且在安装的过程中&#xff0c;…

Java—List的用法与实例详解

List特点和常用方法 List是有序、可重复的容器。 有序指的是&#xff1a;List中每个元素都有索引标记。可以根据元素的索引标记&#xff08;在List中的位置&#xff09;访问元素&#xff0c;从而精确控制这些元素。 可重复指的是&#xff1a;List允许加入重复的元素。更确切地讲…

Java—遍历集合的N种方式总结Collections工具类

遍历集合的N种方式总结 【示例1】遍历List方法1&#xff0c;使用普通for循环 for(int i0;i<list.size();i){ //list为集合的对象名 String temp (String)list.get(i); System.out.println(temp); } 【示例2】遍历List方法2&#xff0c;使用增强for循环(使用泛型定义…

java类的结构2: 方法—(12)

面向对象的特征一&#xff1a;封装与隐藏 1.为什么要引入封装性&#xff1f; 我们程序设计追求“高内聚&#xff0c;低耦合”。 高内聚 &#xff1a;类的内部数据操作细节自己完成&#xff0c;不允许外部干涉&#xff1b; 低耦合 &#xff1a;仅对外暴露少量的方法用于使用。…

Docker 环境下部署 redash

环境&#xff1a; centos7 官网&#xff1a;https://redash.io/help/open-source/dev-guide/docker 一、安装步骤 1、虚拟机安装 安装vmware&#xff0c;并安装centos7 2、安装docker docker安装手册 3、安装nodejs centos下安装Nodejs 4、redash安装 1)、clone git repostory …

List接口常用实现类的特点和底层实现

List接口常用的实现类有3个&#xff1a;ArrayList、LinkedList、Vector。 那么它们的特点和底层实现有哪些呢&#xff1f; ArrayList特点和底层实现 ArrayList底层是用数组实现的存储。 特点&#xff1a;查询效率高&#xff0c;增删效率低&#xff0c;线程不安全。我们一般使用…

java面向对象的特征 —(13)

面向对象的特征一&#xff1a;封装与隐藏 1.为什么要引入封装性&#xff1f; 我们程序设计追求“高内聚&#xff0c;低耦合”。 高内聚 &#xff1a;类的内部数据操作细节自己完成&#xff0c;不允许外部干涉&#xff1b; 低耦合 &#xff1a;仅对外暴露少量的方法用于使用。…

null指针

做了一个关于花卉花木的管理操作&#xff0c;后期因为花卉的类型需要显示在花卉详情页面&#xff0c;所以需要两张表连接。在不写sql语句的前提下&#xff0c;用了外键连接。因为在先前的操作过程中&#xff0c;没有将外键所在字段设置为必填项&#xff0c;导致有一个外键字段为…

jquery Ajax请求本地json

1-1-1 json文件内容(item.json) [{"name":"张国立","sex":"男","email":"zhangguoli123.com","url":"./img/1.jpg"},{"name":"张铁林","sex":"男"…

论文《learning to link with wikipedia》

learning to link with wikipedia 一、本文目标&#xff1a; 如何自动识别非结构化文本中提到的主题&#xff0c;并将其链接到适当的Wikipedia文章中进行解释。 二、主要借鉴论文&#xff1a; Mihalcea and Csomai----Wikify!: linking documents to encyclopedic knowledge 第…

java类的结构:构造器 —(13)

1.构造器&#xff08;或构造方法&#xff09;&#xff1a;Constructor 构造器的作用&#xff1a; 1.创建对象2.初始化对象的信息 2.使用说明&#xff1a; 1.如果没显式的定义类的构造器的话&#xff0c;则系统默认提供一个空参的构造器2.定义构造器的格式&#xff1a;权限修…

java面向对象的特征二:继承性 —(14)

1.为什么要有类的继承性&#xff1f;(继承性的好处&#xff09; ① 减少了代码的冗余&#xff0c;提高了代码的复用性② 便于功能的扩展③ 为之后多态性的使用&#xff0c;提供了前提 图示&#xff1a; 2.继承性的格式&#xff1a; class A extends B{} A:子类、派生类、s…

vuejs怎么在服务器上发布部署

首先VUE 是一个javascript的前端框架&#xff0c;注定了它是运行在浏览器里的&#xff0c;对服务器本地没有任何要求&#xff0c;只要一个静态文件服务器能通过http访问到其资源文件就足矣&#xff01;无论你是用apache ,ngnix 就算你要用node 自己实现一个静态文件服务器&…

C#入门详解(14)

接口&#xff0c;依赖反转&#xff0c;单元测试 接口是协约是规定&#xff0c;所以必须是公开的&#xff0c;只能是public; static void Main(string[] args){int[] num1 new int[] { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(num1).ToString());Console.WriteLine(""…

SpringBoot操作MongoDB实现增删改查

本篇博客主讲如何使用SpringBoot操作MongoDB。 SpringBoot操作MongoDB实现增删改查 &#xff08;1&#xff09;pom.xml引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifac…

java面向对象的特征三:多态性 —(15)

1.多态性的理解&#xff1a;可以理解为一个事物的多种形态。 2.何为多态性&#xff1a; 对象的多态性&#xff1a;父类的引用指向子类的对象&#xff08;或子类的对象赋给父类的引用&#xff09; 举例&#xff1a; Person p new Man(); Object obj new Date(); 3.多态性的…

vue 中$index $key 已移除

之前可以这样: 123456<ulid"example"><liv-for"item in items">{{$index}}{{$key}}</li></ul>现在已经移除,如果还用的话就会报错:Uncaught ReferenceError: $index is not defined; 现在这样写: 123456<ul id"example&qu…