樹狀陣列 樹狀陣列 奇技淫巧專場

2021-07-29 05:11:57 字數 1764 閱讀 2053

本篇文章將介紹一些非常規形態的樹狀陣列的使用。

樹狀陣列中記錄的是一段值異或的結果。

例題:bzoj2819

題目大意:

給定一棵樹,每個節點是一堆石子,給定兩種操作:

1.改變x號節點的石子數量

2.用從x到y的路徑上的所有堆石子玩一次nim遊戲,詢問是否有必勝策略

題解:

既然它只修改點的話,影響到的只是它這棵子樹。那麼很容易就想到了dfs序。這個子樹就是連續一段。先維護每個點dfs開始時和結束時的時間戳。修改的時候先在它自己的開始、結束位置上xor它自己變成零,然後再修改。(x,y)路徑上的xor值=query(x的開始) xor query(y的開始) xor lca(x,y)的點權。很好想通。lca就倍增算一下好了。

**如下:

#include

#include

#include

#include

#include

#define ll long long

#define inf 0x7f7f7f7f

#define n 500005

#define lb(x) (x&-x)

using

namespace

std;

ll read()

while(c<='9' && c>='0')

return x*f;

}int n,m,x,y,v[n],e[n<<1],nex[n<<1],hd[n],tot,ind;

int t[n],l[n],r[n],fa[n][20],dep[n];

char op[5];

void mdy(int x,int v)

}int query(int x)

return ret;

}void add(int u,int v)

void dfs(int u)

r[u]=ind;

}void init()

int lca(int u,int v)

int main()

else

}return

0;}

樹狀陣列中記錄的是一些值的最大值。

例題:bzoj3594

題解:

令f[i][j]表示前i個數上公升j次的最大lis

那麼有f[i][j]=max+1

由於dp方程記錄的是最大值,因此樹狀陣列也必須相匹配,記錄最大值。

這也提示我們樹狀陣列的變化是很靈活的,要根據需要決定。

**如下:

#include

#include

#include

#include

#include

#define lb(x) (x&(-x))

using

namespace

std;

int c[6005][505],dp[10005][505],a[10005];

int n,m,ans,mx;

void mdy(int x,int y,int z)

int query(int x,int y)

int main()

for(int i=1;i<=n;i++)

for(int j=m;j>=0;j--)

printf("%d\n",ans);

return

0;

}

JavaScript奇技淫巧之遍歷陣列

正常的for迴圈就不提了,直接進入正題。如下 1 2 3 4 5 6 7 8 9 示例1 for vari 0,a a jack tom lily andy i 示例2 varary jack tom lily andy for vari 0,a a ary i 從firebug控制台能看到依次輸出...

JS陣列一些奇技淫巧 全

js陣列有許多暴露了api,作為使用者,不僅要會用還要熟練,下面給大家帶來億點點api以及使用技巧供各位嫖客 我也是?享用。先來個資料備忘錄怎麼樣 盜竊位址 本文大部分內容是以上位址,當然也有本人的補充 上圖的補充 every,some 返回的是布林值,表示每個都滿足,或者存在滿足 find fin...

leetcode奇技淫巧 陣列七種去重技巧

使用 list.contains 方法 兩層迴圈暴力法 使用雜湊表 額外的方法 我們在刷 leetcode 時候經常會遇到陣列去重的問題,當然我這裡說的陣列去重也包括 string 字串去重,因為 string 可以 tochararray 嘛。那我們怎麼做呢?什麼樣的場景需要用何種方式呢?怎麼做才...