題目連線:
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 不相鄰,我們可以加入樹剖的修改操作,但是線段樹的修改操...