洛谷P4231 三步必殺

2022-05-10 04:38:13 字數 1303 閱讀 9288

題目描述:

$n$ 個柱子排成一排,一開始每個柱子損傷度為0。

接下來勇儀會進行$m$ 次攻擊,每次攻擊可以用4個引數$l$ ,$r$ ,$s$ ,$e$ 來描述:

表示這次攻擊作用範圍為第$l$ 個到第$r$ 個之間所有的柱子(包含$l$ ,$r$ ),對第乙個柱子的傷害為$s$ ,對最後乙個柱子的傷害為$e$ 。

攻擊產生的傷害值是乙個等差數列。若$l=1$ ,$r=5 $, $s=2$ ,$e=10$ ,則對第1~5個柱子分別產生2,4,6,8,10的傷害。

鬼族們需要的是所有攻擊完成之後每個柱子的損傷度。

輸入輸出格式

輸入格式:

第一行2個整數 $n$ , $m$ ,用空格隔開,下同。

接下來 $m$ 行,每行4個整數 $l$ , $r$ , $s$ ,$e$ ,含義見題目描述。

資料保證對每個柱子產生的每次傷害值都是整數。

輸出格式:

由於輸出資料可能過大無法全部輸出,為了確保你真的能維護所有柱子的損傷度,只要輸出它們的異或和與最大值即可。

(異或和就是所有數字按位異或起來的值)

(異或運算子在c++裡為^)

資料範圍:

本題滿分為100分,下面是4個子任務。(x/y)表示(得分/測試點數量)

妖精級(18/3): $1⩽n ,m⩽1000$ 。這種工作即使像妖精一樣玩玩鬧鬧也能完成吧?

河童級(10/1): $s=e$ ,這可以代替我工作嗎?

天狗級(20/4): $1⩽n⩽1e5$ , $1⩽m⩽1e5$ 。小打小鬧不再可行了呢。

鬼神級(52/2):沒有特殊限制。要真正開始思考了。

以上四部分資料不相交。

對於全部的資料: $1⩽n⩽1e7$ , $1⩽m⩽3×1e5$ ,$1⩽l所有輸入輸出資料以及柱子受損傷程度始終在$[0,9×1e18]$ 範圍內。

我們來看一下這題的需求,區間加乙個等差數列,一開始就可以想到n log n的 差分+線段樹 經典做法。

a[l]~a[r]加上乙個首項為x,公比為y的等差數列的做法

設b陣列為a陣列的差分數列

則:$b[l]+=x$,$b[l]~b[r]+=y$.$b[r+1]-=(r-l)*y$ (末項)

我們發現如果用線段樹去維護它的話,只是乙個區間加,查詢操作只有最後一次。

考慮到不用查詢,我們就可以放棄線段樹,維護a數列的差分數列b的差分數列c

似乎有點繞口?沒關係可以自己模擬一下

反正就是這樣,然後把所有操作都變成區間加。

差分數列區間加的方法區間$(l,r)$加x,$c[l]+=x$,$c[r+1]-=x$;

最後查詢求一遍字首和,完了!!!

洛谷 P4231 三步必殺

乙個操作的過程是這樣的 a 0 0 0 s s d s 2d e 2d e d e 0 0 0 原陣列 b 0 0 0 s d d d d d e 0 0 差分陣列1 c 0 0 0 s d s 0 0 0 0 e d e 0 差分陣列2 乙個如此詭異的操作,還是被神奇的差分陣列消滅了。所以對於每個...

洛谷P4231 三步必殺 差分

題意 有m次詢問每次給一段區間加上個等差序列 思路 題目資料很大,若是用線段樹或樹狀陣列則tle,所以我們想到了進行二次差分 l l 1 r r 1 r 2 s d s 0 e d e 然後進行兩次字首和 include using namespace std typedef long long l...

(差分)洛谷P4231 三步必殺

題目背景 三 舊都 離開狹窄的洞穴,眼前豁然開朗。天空飄著不尋常的雪花。一反之前的幽閉,現在面對的,是繁華的街市,可以聽見酒碗碰撞的聲音。這是由被人們厭惡的鬼族和其他妖怪們組成的小社會,一片其樂融融的景象。誒,不遠處突然出現了一些密密麻麻的小點,好像大顆粒揚塵一樣。離得近了點,終於看清楚了。長著角的...