bzoj 3211 花神遊歷各國 題解

2021-08-08 19:15:32 字數 1563 閱讀 7518

題目傳送門

題意解析:題目就是告訴你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的數頂多...