關於M的計算方法
int M = 1;for (; M < n;)M <<= 1;if (M > 1) M--;
今天讀學生代碼,小朋友的代碼都很規範
int M = 1;for (; M < n;) { M <<= 1;}if (M > 1) { M--;}
可是,好長啊,多年前看見主任的幾個log感覺自己寫不出來(當時自己確實寫不出來)
現在試試吧M = (1 << (int)(ceil)(log(i)/log(2))) - 1,諾
void emmm(){ for (int i = 1; i <= 1000000;i++){ int M = 1; for (; M < i;) { M <<= 1; } if (M > 1) { M--; } int k = (1 << (int)(ceil)(log(i)/log(2))) - 1; if (k != M){ printf("%d, %d, %d\n", i, M, k); } }}
發現n=1的時候不一樣,當時加那個M--的if的時候似乎是在某次cf上,現在腦子一想,好像n=1的時候M就該是0
打擾了,告辭
一句話
M = (1 << (int)(ceil)(log(i)/log(2))) - 1;
現在板子長這樣
struct ZKWSegTree{ #define lc (t<<1) #define rc (t<<1^1) int sum[N], M; inline void build(int n){ M = (1 << (int)(ceil)(log(i)/log(2))) - 1; memset(sum, sizeof(sum), 0); for (int i = 1+M; i <= n+M; i++){ scanf("%d", &sum[i]); } for (int t = M; t >= 1; t--){ sum[t] = sum[lc] + sum[rc]; } } void add(int t, int x){ for (sum[t+=M]+=x, t>>=1; t; t>>=1){ sum[t] = sum[lc] + sum[rc]; } } int query(int l, int r){ int ans = 0; for (l+=M-1,r+=M+1; l^r^1; l>>=1,r>>=1){ if (~l&1) ans += sum[l^1]; if ( r&1) ans += sum[r^1]; } return ans; }} T;