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.pswp.cn/news/247727.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247727.shtml
英文地址,請注明出處:http://en.pswp.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…