思路:
差分其實是個自己隨便創造的東西啊~
差分(這裡的小差分):
比如你要算一棵樹上 u->v 路徑上的次數, v是 u 子樹上的乙個點,
算一棵樹上 u->v 路徑上的次數 在這了是算u -> v路徑上除了 v 的 每個節點的次數,
對於每一對u, v (u -> v)的,用c[i]計數,可以c[fa[ u ]]–, c[fa[ v ]]++ (fa[i] 是 i 的前驅節點), 然後跑一下dfs,統計次數,具體處理就是對於每個節點去加上他的所有子節點的次數,然後就會發現就這麼搞好了。。
樹上倍增:
福利:真講的超級棒!!!
處理完倍增以後,就是每次找乙個能「跳」的最遠位置!
對於第一次應用倍增和差分,真是感覺非常...爽啊...
要多刷一波倍增的題了!!!**參考自:
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
#define mem(a,b) memset(a, b, sizeof(a))
#define lmid left, mid
#define rmid mid+1,right
#define lson num<<1, left, mid
#define rson num<<1|1, mid + 1, right
const
int maxn = 2e5 + 10;
struct edgeedge[maxn<<1];
int n, head[maxn], tol, f[maxn][23];
ll w[maxn], c[maxn], dis[maxn];
void init()
void add(int u,int v, ll w), head[u] = tol++;
edge[tol] = (edge), head[v] = tol++;
}void dfs1(int u, int fa)
}void dfs2(int u, int fa)
}int main()
dfs1(1, 0);
dfs2(1, 0);
for(int i=1;i<=n;i++)
printf("%i64d ", c[i]);
return
0;}
codeforces 739C 線段樹的高階應用
題意,給你乙個序列,有q次操作,每次對乙個區間進行加值,同時要輸出 最長的上公升序列 下降序列 先上公升再下降序列 很明顯能想到的是利用線段樹維護,有很明顯的能想到要維護線段樹的每個區間的左邊界和右邊界的值,並且每個點都有維護四種變化的值,然後就懵逼了。這時候應該想到的是維護每個區間的左右邊界的四種...
Codeforces482B 線段樹構造
題意 有m個限制,每個限制有l,r,q,表示從a l a r 取且後的數一定為q,問是否有滿足的數列。思路 看到大牛說是線段樹,線段樹對於區間操作,印象中乘啊,啊,啊都不錯,但是並沒有就是對於這個位運算就不懂了 這題的題意就是構造,大致思路是 每條限制是對於每個區間處理就是或上q 可以保證相應的二進...
Codeforces482B 線段樹構造
題意 有m個限制,每個限制有l,r,q,表示從a l a r 取且後的數一定為q,問是否有滿足的數列。思路 看到大牛說是線段樹,線段樹對於區間操作,印象中乘啊,啊,啊都不錯,但是並沒有就是對於這個位運算就不懂了 這題的題意就是構造,大致思路是 每條限制是對於每個區間處理就是或上q 可以保證相應的二進...