本篇文章將介紹一些非常規形態的樹狀陣列的使用。
樹狀陣列中記錄的是一段值異或的結果。
例題: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 嘛。那我們怎麼做呢?什麼樣的場景需要用何種方式呢?怎麼做才...