題目傳送門
題意解析:題目就是告訴你n個數,然後有m個詢問,每次詢問有兩個操作,乙個是把一段區間內的和輸出,乙個是把一段區間中的每個數取根號。
my opinion:看到這題就應該知道應該用資料結構維護,不過這個根號該怎麼辦呢?我們都知道,根號讓乙個數降下來只需要幾次就好了,而根號1或者0都不會變的,我算了一下讓10^9變成1或0只需要根號5次就好了,所以,我們可以每次暴力根號,如果一段區間已經全部變成了0或1就不需要更改。那麼就是剩下用什麼資料結構了,當然是線段樹或者分塊了,然而有dalao跟我說分塊超時?(我沒有試過),所以就直接寫線段樹了。
總結:
1、建樹。
2、每次暴力維護,查詢依舊。
對,沒了,就這麼些。
**:
#include
#include
#include
#include
#include
#include
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
#define clear(a,x) memset(a,x,sizeof(a))
#define ll long long
#define inf 2000000000
#define eps 1e-8
#define left root<<1
#define right root<<1|1
#define left root<<1,l,mid
#define right root<<1|1,mid+1,r
using
namespace
std;
int read()
const
int maxn=100005;
ll sum[maxn<<2];
bool xyf[maxn<<2];
int a[maxn];
int n;
void up(int root)
void build(int root,int l,int r)
int mid=(l+r)>>1;
build(left);
build(right);
up(root);
}ll find(int root,int l,int r,int x,int y)
void change(int root,int l,int r,int x,int y)
int mid=(l+r)>>1;
if (y<=mid) change(left,x,y);
else
if (x>mid) change(right,x,y);
else
up(root);
}int main()
return
0;}
附上ac記錄: BZOJ3211 花神遊歷各國
3211 花神遊歷各國 time limit 5 sec memory limit 128 mb submit 1144 solved 416 submit status discuss description input output 每次x 1時,每行乙個整數,表示這次旅行的開心度 sample...
bzoj3211 花神遊歷各國
其實這是一道sb題 哦不其實是兩道2333333 還有3038也是同一題 然而在寫3038的時候由於資料太水直接就a掉了。剛剛拿之前的code交上去就wa啦。不能判斷區間和是否 r l 1因為會出現0 所以要開多乙個東西表示這個區間還有多少個數不會再改變了 每個數可以開方的次數是很小的,就當做是常數...
bzoj 3211 花神遊歷各國
每次x 1時,每行乙個整數,表示這次旅行的開心度 4 1 100 5 5 51 1 2 2 1 2 1 1 2 2 2 3 1 1 4 10111 11對於100 的資料,n 100000,m 200000 data i 非負且小於10 9 對於這個開方,一開始yy了好久,後來發現,10 9的數頂多...