時間限制: 1000 ms 記憶體限制: 524288 kb
提交數: 127 通過數: 47
原題來自:bzoj 3211
花神喜歡步行遊歷各國,順便虐爆各地競賽。花神有一條遊覽路線,它是線型的,也就是說,所有遊歷國家呈一條線的形狀排列,花神對每個國家都有乙個喜歡程度(當然花神並不一定喜歡所有國家)。
每一次旅行中,花神會選擇一條旅遊路線,它在那一串國家中是連續的一段,這次旅行帶來的開心值是這些國家的喜歡度的總和,當然花神對這些國家的喜歡程式並不是恆定的,有時會突然對某些國家產生反感,使他對這些國家的喜歡度 δ
變為 δ√
(可能是花神虐爆了那些國家的 oi,從而感到乏味)。
現在給出花神每次的旅行路線,以及開心度的變化,請求出花神每次旅行的開心值。
第一行是乙個整數 n,表示有 n個國家;
第二行有 n個空格隔開的整數,表示每個國家的初始喜歡度 δ
i;第三行是乙個整數 m,表示有 m條資訊要處理;
第四行到最後,每行三個整數 x,l,r,當 x=1 時詢問遊歷國家 l 到 r 的開心值總和,就是 ∑r
i=lδ
i ,當 x=2 時國家 l 到 r 中每個國家的喜歡度 δ
i變為 δ
i−−√。
每次 x=1
時,每行乙個整數。表示這次旅行的開心度。
41 100 5 5
51 1 2
2 1 2
1 1 2
2 2 3
1 1 4
101對於全部資料,1≤n≤105,1≤m≤2×105,1≤l≤r≤n,0≤δ1111
i≤109。
注:建議使用 sqr
t 函式,且向下取整。
思路:
這個題是要求開方的,我們可以知道,乙個數多開幾次都會變成1,所以用flag標記,flag=1時表示不用開方了。
**如下:
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef pairp;
const int inf=4e8;
const int n=100015,mod=32767;
ll sum[n<<2];
int flag[n<<2];
void push_up(int rt)
void build(int l,int r,int rt)
int m=(r+l)>>1;
build(lson);
build(rson);
push_up(rt);
}void push_down(int l,int r,int rt)
int m=(l+r)>>1;
push_down(lson);
push_down(rson);
push_up(rt);
}}ll query(int l,int r,int l,int r,int rt)
int m=(l+r)>>1;
ll ans=0;
if(l<=m)ans+=query(l,r,lson);
if(r>m)ans+=query(l,r,rson);
return ans;
}void update(int l,int r,int l,int r,int rt)
int m=(l+r)>>1;
if(l<=m)update(l,r,lson);
if(r>m)update(l,r,rson);
push_up(rt);
}int main()
else
}}
線段樹 H 花神遊歷各國
output 每次x 1時,每行乙個整數,表示這次旅行的開心度 sample input 4 1 100 5 5 5 1 1 2 2 1 2 1 1 2 2 2 3 1 1 4 sample output hint 對於100 的資料,n 100000,m 200000 data i 非負且小於10...
花神遊歷各國
0 和 1 開方之後不會改變,對 0,1 節點打上標記 如果孩子節點都打上標記了,說明這些孩子節點的和不會改變,那麼父節點也打上標記 對於打上標記的點,change 的時候直接 return include include int n,m long long arr 100005 2 at 1000...
花神遊歷各國 bzoj3211 線段樹
有乙個n個數的序列a,請寫乙個程式完成下列操作 1 l r表示查詢l到r的和 2 l r表示把每個a x l x r 變為sqrt x n 100000,m 100000 其實我是偶然看過冪偉的題解的 滑稽 109 最多開根6次就變成1了,對於1無論怎樣開根都是不影響的 兩種做法。如果是樹狀陣列的話...