丟手絹
題意:
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 個火柴的高度。每列火柴中相鄰兩根...