time limit: 30 sec
memory limit: 128 mb
submit: 2513
solved: 846 [
submit][
status][
discuss]
一棵n個點的樹,每個點的初始權值為1。對於這棵樹有q個操作,每個操作為以下四種操作之一:
+ u v c:將u到v的路徑上的點的權值都加上自然數c;
- u1 v1 u2 v2:將樹中原有的邊(u1,v1)刪除,加入一條新邊(u2,v2),保證操作完之後仍然是一棵樹;
* u v c:將u到v的路徑上的點的權值都乘上自然數c;
/ u v:詢問u到v的路徑上的點的權值和,求出答案對於51061的餘數。
第一行兩個整數n,q
接下來n-1行每行兩個正整數u,v,描述這棵樹
接下來q行,每行描述乙個操作
對於每個/對應的答案輸出一行
3 21 2
2 3* 1 3 4
/ 1 1
4資料規模和約定
10%的資料保證,1<=n,q<=2000
另外15%的資料保證,1<=n,q<=5*10^4,沒有-操作,並且初始樹為一條鏈
另外35%的資料保證,1<=n,q<=5*10^4,沒有-操作
100%的資料保證,1<=n,q<=10^5,0<=c<=10^4
lct,區間加,區間乘
其實pushdown操作只需要splay的時候傳下來,確保splay(x)後,x更新為正確的就行了,
其他的地方權當懶得刪了
#include#include#include#include#include#include#include#include#includeusing namespace std;
#define for(i,n) for(int i=1;i<=n;i++)
#define fork(i,k,n) for(int i=k;i<=n;i++)
#define rep(i,n) for(int i=0;i=0;i--)
#define forp(x) for(int p=pre[x];p;p=next[p])
#define forpiter(x) for(int &p=iter[x];p;p=next[p])
#define lson (x<<1)
#define rson ((x<<1)+1)
#define mem(a) memset(a,0,sizeof(a));
#define memi(a) memset(a,127,sizeof(a));
#define memi(a) memset(a,128,sizeof(a));
#define inf (2139062143)
#define f (51061)
#define maxn (100000+10)
#define maxq (100000+10)
#define maxc (10000)
typedef unsigned int ll;
void mul(ll &a,ll b)
void add(ll &a,ll b)
class lct
void pushdown(int x)
if (mulv[x]!=1)
if (addv[x])
} void maintain(int x)
void rotate(int x)
father[x]=father[y];
father[y]=x;
ch[x][!kind]=y;
if (root[y])
else
maintain(y);maintain(x); }
void p(int x)
void splay(int x)
else
} }
int access(int x)
while (x) ;
return y; }
void cut(int x)
void join(int x,int y)
void reverse(int x)
void make_root(int x)
int get_root(int x)while(1);
return x; }
void mul(int x,ll cost)
void add(int x,ll cost)
}s;int n,q;
int main()
for(i,q) else if (c[0]=='-') else if (c[0]=='/') }
return 0;
}
樹鏈剖分 bzoj2243
time limit 20 sec memory limit 512 mb submit 2492 solved 960 submit status 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段數量 連續相同顏色...
BZOJ 4893 項鍊分贓
有一串長度為n的項鍊,上面有紅綠藍三種顏色的珠子,每種顏色的珠子數目都是偶數,現在要你把它切幾刀分成 若干段,把其中一些段分給海盜1,剩餘的段分給海盜2,要求兩個海盜分得的每種顏色的珠子數量都相同,請輸出 最少需要切多少刀。第一行乙個整數n,表示項鍊的長度。第二行n個0 2的整數,分別表示紅綠藍三種...
bzoj 3611(鏈剖 字首和)
來複習鏈剖吧。以前一直認為鏈剖和線段樹一定是標配。其實以前學鏈剖的時候沒有理解到位。鏈剖可以說和dfs序是同一種手段,他們都是把樹結構對映到陣列上去的手段,因此鏈剖準確來說應該是一種演算法而不是資料結構。這題記得以前貌似是用樹狀陣列維護的?也是大材小用了。include include includ...