花神遊歷各國(線段樹,區間開平方)

2021-09-23 05:52:01 字數 1589 閱讀 8100

題目描述

原題來自:bzoj 3211

花神喜歡步行遊歷各國,順便虐爆各地競賽。花神有一條遊覽路線,它是線型的,也就是說,所有遊歷國家呈一條線的形狀排列,花神對每個國家都有乙個喜歡程度(當然花神並不一定喜歡所有國家)。

每一次旅行中,花神會選擇一條旅遊路線,它在那一串國家中是連續的一段,這次旅行帶來的開心值是這些國家的喜歡度的總和,當然花神對這些國家的喜歡程式並不是恆定的,有時會突然對某些國家產生反感,使他對這些國家的喜歡度 x 變為 sqrt(x)(可能是花神虐爆了那些國家的 oi,從而感到乏味)。

現在給出花神每次的旅行路線,以及開心度的變化,請求出花神每次旅行的開心值。

輸入格式

第一行是乙個整數 n,表示有 n個國家;

第二行有 n 個空格隔開的整數,表示每個國家的初始喜歡度xi ;

第三行是乙個整數m ,表示有 m條資訊要處理;

輸出格式

每次 x=1 時,每行乙個整數。表示這次旅行的開心度。

樣例樣例輸入

4

1 100 5 5

51 1 2

2 1 2

1 1 2

2 2 3

1 1 4

樣例輸出

思路:根據資料範圍我們知道,對於乙個數來說,不會開很多次根號。再來考慮 sqrt(0)=0  sqrt(1)=1

所有對於連續 0 或 1 的資料根本不需要處理的。所以我們用乙個標記記錄區間是否需要操作,繼續跑線段樹就好了。

ac**如下:

#include#define ll long long

#define n 400010

using namespace std;

ll sum[n];

bool book[n];

void build(int l,int r,int o)

int mid=(l+r)>>1;

build(l,mid,o<<1);

build(mid+1,r,o<<1|1);

sum[o]=sum[o<<1]+sum[o<<1|1];

book[o]=book[o<<1]&&book[o<<1|1];

return;

}void update(int x,int y,int l,int r,int o)

int mid=(l+r)>>1;

if(x<=mid)update(x,y,l,mid,o<<1);

if(y>mid)update(x,y,mid+1,r,o<<1|1);

sum[o]=sum[o<<1]+sum[o<<1|1];

book[o]=book[o<<1]&&book[o<<1|1];

}ll query(int x,int y,int l,int r,int o)

int main()

return 0;

}

花神遊歷各國 線段樹開方

時間限制 1000 ms 記憶體限制 524288 kb 提交數 127 通過數 47 原題來自 bzoj 3211 花神喜歡步行遊歷各國,順便虐爆各地競賽。花神有一條遊覽路線,它是線型的,也就是說,所有遊歷國家呈一條線的形狀排列,花神對每個國家都有乙個喜歡程度 當然花神並不一定喜歡所有國家 每一次...

線段樹 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...

BZOJ 3211 花神遊歷各國 線段樹平方開根

題目大意 思路 由於資料範圍只有1e9,乙個數字x開根號次數超過logx之後均為1,所以可以暴力開根號,但是需要剪枝優化,如果子樹的max小於等於1,那麼直接跳過即可。否則遞迴到葉子節點暴力開根號。1 include2 define ios ios sync with stdio false 不可再...