luogu P3950 部落衝突 題解

2022-05-05 21:18:07 字數 2326 閱讀 3489

題目連線:

1.像我這種學資料結構學傻了的

2.邊權化點權 所有點權初始化0

3.對於戰爭 將深度較深的-1,對於和平 將深度較深的+1

4.對於歷史 用war記錄

5.特別注意 在兩個查詢的lca處判斷是否為-1並且當前的整條路徑上的點權也為-1時 同樣是yes

**:using namespace std;

const int maxn = 300000 + 10;

struct warwa[maxn];

int war_cnt = 0;

struct edgee[maxn<<2];

int head[maxn], cnt;

int tree[maxn<<2], lazy[maxn<<2];

int seg[maxn], top[maxn], fa[maxn], son[maxn], size[maxn], deep[maxn], rev[maxn], num;

int node[maxn], n, m, root, res;

void add(int u, int v)

//-----segment_tree-----

void pushup(int rt)

void build(int left, int right, int rt)

int mid = (left + right)>>1;

build(lson);

build(rson);

pushup(rt);

}void pushdown(int left, int right, int rt, int mid)

void update(int l, int r, int add, int left, int right, int rt)

int mid = (left + right)>>1;

if(lazy[rt]) pushdown(left, right, rt, mid);

if(l <= mid) update(l, r, add, lson);

if(r > mid) update(l, r, add, rson);

pushup(rt);

}int query(int l, int r, int left, int right, int rt)

int mid = (left + right)>>1;

if(lazy[rt]) pushdown(left, right, rt, mid);

if(l <= mid) res += query(l, r, lson);

if(r > mid) res += query(l, r, rson);

return res;

}//-----------

void dfs1(int u, int f, int d)}}

void dfs2(int u, int t)

}int lca(int x, int y)

return deep[x] < deep[y] ? x : y;

}int qrange(int x, int y)

if(deep[x] > deep[y]) swap(x, y);

res = 0;

res = query(seg[x], seg[y], 1, n, 1);

ans = (ans + res);

return ans;

}void updrange(int x, int y, int k)

if(deep[x] > deep[y]) swap(x, y);

update(seg[x], seg[y], k, 1, n, 1);

}int main()

dfs1(root,0,1);

dfs2(root,root);

build(1,n,1);

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

int pp = qrange(p, p);

if(now == -1 && pp == -1)

if(now != 0)

}if(opt == 'c')

if(opt == 'u')

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

coutreturn 0;}/

7 91 2

1 33 4

5 37 4

4 6c 3 1

c 3 4

q 1 2

q 1 4

q 4 5

q 6 7

u 2q 5 4

q 1 5

yesno

noyes

yesno

*/

luogu P3950 部落衝突

題面傳送門 樹剖裸題,感覺難度虛高。當兩個部落開戰時,我們就把下面那個點的權值設為1 11,休戰則設為0 00即可。這樣有乙個好處就是查詢時如果有1 11可以直接跳出。其他基本操作。實現 include include using namespace std int n,m,k,f 600039 x...

Luogu P3950部落衝突(樹鏈剖分)

題目鏈結 狀態奇差無比,sbt都能錯一遍。不動筆光想沒有想到怎麼做,畫圖之後發現乙個很明顯的性質 那就是兩個開戰的部落,其中乙個是另乙個的父親。所以在兒子那裡加個權值。查詢的時候樹鏈剖分查詢鏈上點權和,減去lca的點權 因為lca那如果有點權,代表的是lca和lca的父親之間的那條邊 include...

P3950 部落衝突

此題用樹鏈剖分是大材小用了,因為它可以處理 p,q 不相鄰的情況。簡化一下題意 這都是一些樹上的操作,乍一看可以用樹剖直接搞。但是因為這裡是邊進行操作,所以我們可以以點代邊,把邊看做點。每一次查詢的時候 lca p,q 是不能算的。如果 p,q 不相鄰,我們可以加入樹剖的修改操作,但是線段樹的修改操...