SHU oj 422 風力觀測 線段樹

2022-02-19 11:03:18 字數 3387 閱讀 6476

描述

小y正在觀測y地區的風力情況,他在一條直線上依此設定了n

個觀測點,並觀測與直線垂直方向的風力值,風力有時是正向的也有時是反向的,規定正向時的風力值為正數,他發現每次風力值的變化都可以表示為觀測點上一條線段[l,r]

上的同時增強或者減弱。小y希望能夠實時統計這些觀測點的資料,並且實時分析這些觀測點在歷史中到達的風力最大絕對值,但是他無法同時對大量的觀測點進行分析, 更重要的是他記不住這些觀測點過去的風力大小,於是他希望你來用計算機幫助他完成這個任務。

你簡化了這個問題,將問題分為兩種查詢:

1.對觀測點[l,r]

上的風力正向增強x

。(x為負數表示正向減弱,即反向加強)

2.查詢觀測點a

上的歷史風力最大絕對值。

輸入第一行有乙個整數t

表示資料組數。(t<=10

)接著有t

組資料,每組資料第一行是整數n

和q,表示觀測點個數和查詢次數。

第二行有n

個數a1,...,an

,表示每個觀測點的風力初始值。

接著有q

行,表示q

次操作,格式為:

1 l r x:表示對[l,r]

線段上的正向風力同時增強x

。2 a:表示查詢a

點的歷史風力最大絕對值。

1<=n,q<=100000

。1<=l,r,a<=n

−10000<=ai

, x<=10000

輸出對每次詢問2,輸出乙個數字表示風力值並換行。

樣例輸入1

複製

1

5 61 -1 2 3 -3

1 1 5 1

2 12 2

1 2 4 -5

2 22 3

樣例輸出1

215

3

官方題解有注釋

#include#include

#include

#include

#include

using

namespace

std;

#define mid (l+r)/2

#define ls 2*rt

#define rs 2*rt|1

#define lson ls,l,mid

#define rson rs,mid+1,r

const

int mx = 1e5+5

;typedef pair

p;int max[mx<<3],min[mx<<3],lazy[mx<<3

];int

a[mx];

intn,m;

void push_down(int

rt)void update(int rt,int l,int r,int l,int r,int

v)

if(max[rt]||min[rt]||lazy[rt]) //

如果其中有乙個不為0那就更新

push_down(rt);

if(l>mid) update(rson,l,r,v);

else

if(r<=mid) update(lson,l,r,v);

else

}p query(

int rt,int l,int r,int

x);

if(max[rt]||min[rt]||lazy[rt])

push_down(rt);

if(x > mid) return

query(rson,x);

else

return

query(lson,x);

}int

main()

else}}

return0;

}

另一種寫法:

對於每顆線段樹都是一時間為節點,而不是以原來的每個點為點,;

每個點對應一顆線段樹,這顆線段樹是以時間為點,進行更新;

巧妙的是,對於區間更新的方式,是從上一顆線段樹繼承下去的,有點可持久化的意思;

#pragma comment(linker, "/stack:1024000000,1024000000")#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define pi (4*atan(1.0))

#define eps 1e-14

#define bug(x) cout<<"bug"int n=1e5+10,m=2e6+10,inf=1e9+10

;const ll inf=1e18+10,mod=1e9+7

;struct

sgt

void pushdown(int

pos)

}void build(int l,int r,int

pos)

void update(int l,int r,int c,int l,int r,int

pos)

pushdown(pos);

int mid=(l+r)>>1

;

if(l<=mid)update(l,r,c,l,mid,pos<<1

);

if(r>mid)update(l,r,c,mid+1,r,pos<<1|1

); pushup(pos);

}pair

query(int l,int r,int l,int r,int

pos)

if(r>mid)

return

make_pair(minn,maxx);

}}tree;

inta[n],ans[n];

vector

int,int> >v[n];

vector

qq[n];

intmain()

else

}tree.build(

1,q,1

);

for(int i=1;i<=n;i++)

}for(int i=1;i<=q;i++)

if(ans[i]2

) printf(

"%d\n

",ans[i]);

}return0;

}

SHUOJ幾隊周尼瑪

超級無敵張小豪是a國的一名勇士,a國的勇士都要靠獲得能量變得更強,在a國勇士獲得能量只有唯一的一種途徑就是膜拜宙斯神 周尼瑪 桑!要膜拜周尼瑪就要去到遙遠的大日國那裡有好多好多周尼瑪 桑!但是周尼瑪 桑!是一種群居動物,一隊周尼瑪 桑!中都有且只有乙個領袖叫周尼瑪你妹 桑!超級無敵張小豪勇士必須拿著...

SHUOJ新增好友

tony最近喜歡上了龍之谷遊戲,所以他想叫上他的好友組建乙個公會來一起享受這款遊戲。tony一共有n個好友,他可以叫上任意k 1 k n 個好友來組建公會,並且所有好友都會答應他的請求。問tony一共可以有多少種方案組建這個公會?只要不是完全相同的人組建的方案視為不同方案,並且tony至少要叫上乙個...

4 22學習總結

今天繼續學習python想要爬取研究生招生資訊網的資料並存入資料庫 遇到的困難 爬取資料還不熟練,我只得到了一行一列 哭唧唧 總結 import bs4import pymysql import requests from bs4 import beautifulsoup import pandas...