GalaxyOJ 727 線段樹區間最小值

2021-08-03 18:48:51 字數 2010 閱讀 9445

problem description

wzj同學熟悉電腦操作,於是他找了乙個打字員的工作。他的工作主要是編輯乙個有n行的文字,每一行的字元數量不盡相同。如我們所知的一樣,文字中有乙個游標,它一開始在第1行的最後乙個字元後面,wzj可以在游標的位置輸入或刪除字元。當然,他也可以用方向鍵移動游標,可以往上、下、左、右移動。要注意的是,如果當前游標所在的位置前面有a個字元,如果要將其向下(上)移動,而下(上)一行的字元不足a個,那麼游標就會落在下(上)一行的最後乙個字元後面。

現在,wzj知道這個文字的行數n和每一行所含的字元數ai,他的上司給了他乙個操作序列,共有q個操作,操作分為3種,如下:

to a:將游標移到第a行的最後乙個字元之後。

insert a:在當前游標所在行的末端插入a個字元。

delete a:在當前游標所在行的末端刪除a個字元。

已知向上、下、左、右移動一格,插入或刪除乙個字元都需要1次按鍵,而wzj又是乙個很懶的人,他想知道要完成這些操作至少需要多少次按鍵。特殊地,如果刪除操作中當前行的字元不足a個,則按鍵數應為該行有的字元數。

input

第一行有2個以空格間隔的整數n和q,意義如題目描述中所述。

接下來的一行,有n個以空格間隔的整數,其中第i個整數表示第i行的字元數ai。

接下來的q行,每一行有乙個操作指令,格式如題目描述中所述。

1≤n,q≤200000,操作過程中每行的字元數不超過1000000,輸入的指令均合法,行首沒有空格。

output

輸出乙個整數,為完成操作至少所需的按鍵次數(結果可能較大,建議使用long long型儲存)。

sample input

5 5

2 3 2 4 2

to 2

insert 2

to 4

delete 5

to 2

sample output

樣例說明(移動指令中上下左右以udlr代替)

第1個操作,以「dr」順序移動,按鍵數為2。

第2個操作,按鍵數為2,第2行字元數變為5。

第3個操作,以「ddrr」順序移動,按鍵數為4。

第4個操作,第4行字元數不足5個,所以只需4次按鍵,第4行字元數變為0。

第5個操作,以「urrurrr」順序移動,按鍵數為7。

所以按鍵數總共為2+2+4+4+7=19次。

#include 

#include

#include

#define mid ((l+r)>>1)

#define l (x<<1)

#define r (l+1)

using

namespace

std;

int t[800005],a[200005],aim,min,max,nx,ny,n,q,k;

char ch[20];

long

long ans;

void bui(int x,int l,int r)

bui(l,l,mid);

bui(r,mid+1,r);

t[x]=min(t[l],t[r]);

}int que(int x,int l,int r)

void chg(int x,int l,int r)

if (mid>=nx) chg(l,l,mid);

if (mid+1

<=nx) chg(r,mid+1,r);

t[x]=min(t[l],t[r]);

}int main()

if (ch[0]=='i')

if (ch[0]=='d')

}printf("%lld",ans);

}

線段樹(2)區間修改

快速序列操作i,給出乙個n個元素的陣列a1,a2,an,你的任務是設計乙個資料結構支援一下兩種操作 set l,r,v 把al,al 1,ar的值全部修改為v v 0 query l,r 計算子串行al,al 1,ar的元素和 最小值和最大值。include include using namesp...

線段樹2(區間更新)

區間更新是指更新某個區間內的葉子節點的值,因為涉及到的葉子節點不止乙個,而葉子節點會影響其相應的非葉父節點,那麼回溯需要更新的非葉子節點也會有很多,如果一次性更新完,操作的時間複雜度肯定不是o lgn 例如當我們要更新區間 0,3 內的葉子節點時,需要更新出了葉子節點3,9外的所有其他節點。為此引入...

線段樹002 區間修改

接下來講解一下區間修改 比如在下面這個圖中我要將1 5區間的值全都改為v 正常人的思維是把1 5這個區間的修改看成對點1,2,3,4,5的單點修改 但這樣的複雜度是nlog n 是比較高的 我們換一種想法,在修改區間的時候我們仍然像區間查詢一樣自上而下的尋找要修改的區間。那麼我們最後 找到區間是1 ...