題目描述
原題來自: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 不可再...