描述
小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
複製
15 61 -1 2 3 -3
1 1 5 1
2 12 2
1 2 4 -5
2 22 3
樣例輸出1
2153
官方題解有注釋
#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...