CSUST 2013 丟手絹 (線段樹)

2021-10-08 15:28:06 字數 1561 閱讀 1239

丟手絹

題意:

n個數編號為 1 - n 圍成乙個環,給出 q 次操作,點修改,和查詢 相距不超過k的兩個數字之和的最大值和最小值。

思路:

注意資料範圍 k 最大是 5 ,我們可以 o ( n )的求出每個長度為 k 的區間裡的 最大值次大值,最小值次小值,也就可以得到答案,但是還有修改,因為每次修改,最多改變 k 個區間的最值,所以我們還是可以直接修改這個小區間的最值 ,但這還不是我們要求的,我們可以把每個點的權值定義為 以當前位置為左邊界長度為 k的區間的兩數字之和的最大值,然後用線段樹維護這個最大值,就可以得到答案了,每次修改相當於 k 次單點修改。

**:

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e6+7;

int val[maxn]

,n,q,k;

struct nodee[maxn]

;int ans1[maxn]

,ans2[maxn]

;void

pushup

(int rt)

void

update1

(int i,

int c1,

int c2,

int l,

int r,

int rt)

ll m=

(l + r)

>>1;

if(i <= m)

update1

(i,c1,c2,l,m,rt<<1)

;else

update1

(i,c1,c2,m+

1,r,rt<<1|

1);pushup

(rt);}

void update (

int pos,

int x)

else

if(val[ j % n]

> e[i]

.mmx)

if(val[j % n]

<= e[i]

.mn)

else

if(val[ j % n]

< e[i]

.mmn)

}update1

(i+1

,e[i]

.mx+e[i]

.mmx,e[i]

.mn+e[i]

.mmn,

1,n,1)

;}}int

main()

if(op==2)

}}

CSUST 上場最簡單題 題解(線段樹)

從左到右選三道題,要求難度遞增,求花費時間的最小值。emm,對於這種題目,看到三個值,其實就想要列舉中間值,然後這個又是類似於逆序對。以難度值為節點編號 時間為節點值,然後邊找邊更新,左右都來一次就好了。include include include include include include ...

ZSOI2013 花瓶 線段樹

題意 給出兩種操作,一種是從a開始向後放花,一種是把a到b的花全部扔掉。放過的位置就不能再次放 顯然線段樹,加上兩種標記,一種是這塊是滿的,一種是這塊是空的,然後第一種操作答案帶上三個值 include include include include include include define l...

NOIP2013 火柴排隊 線段樹 逆序對

codevs 題目描述 description 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 其中 ai表示第一列火柴中第 i 個火柴的高度,bi表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根...