我這種方法不是最簡單的方法,不過我覺得比較好理解
題意:給出乙個01字串,每次從中間折取建成乙個二叉樹,若子樹都是0則是b樹,都是1則是i樹,否則為f樹,求出該樹的後續遍歷
思路:首先我想到的是這個建樹過程和線段樹很像,每個節點儲存的是以該點為根的什麼樣的樹,0代表b樹,1代表i樹,2代表f樹。接著我又想到了資料結構中學過的鏈式二叉樹的後續遍歷。
code:
#include #include #include #include #include #define ls node*2 + 1 // 左兒子
#define rs node*2 + 2 // 右兒子
using namespace std;
const int n = 10000;
string str;
int tree[n];
vectorve;
int pow2(int n)
void push_up(int node)
// 建樹
void build(int start, int end, int node)
int mid = (start + end) / 2; // 每次從中間折取
build(start, mid, ls);
build(mid + 1, end, rs);
push_up(node);
}// 後續遍歷,左右根
void postorder(int node)
int main()
cout << endl;
return 0;
}
牛客網 剩下的樹 線段樹入門
mn o mn o mn 複雜度都可以過,可以見得資料之水當然這道題的資料量本身也是符合這個複雜度的,ps fill和memset別用得太多,有時候會被卡死 include include include include include include include include using n...
sequence 牛客 ( 線段樹)
題面 your are given two sequences a1 n,b1 n a b a1 n b1 n you need to answer max 1 l r n displaystyle max times sum b 1 l r nmax 1e 6 b i 1e 6 1e6 1 e6 ...
帶 sin, cos 的線段樹 牛客
題意 給你 n 個數字,第一種操作是將乙個區間內每乙個數字加上同乙個數字,第二種操作是求乙個區間內每乙個數 sin 的累加和 思路分析 對於每個區間維護一下 cos 和 sin 的值,當乙個區間要加上乙個數字時,此時再重新計算 sin的值時 sin a x sin a cos x cos a sin...