(
題意:一棵樹,點權值,q詢問,詢問a到b的路徑上最長的一段上公升序列。
解法:樹鏈剖分點操作,是帶方向的,並且必須是a到b,不能是b到a。
//#pragma comment(linker, "/stack:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
#include
#include
//#pragma comment(linker, "/stack:1024000000,1024000000")
using
namespace
std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define inf 1e9
#define debug(a) cout << #a" = " << (a) << endl;
#define debugarry(a, n) for (int i = 0; i < (n); i++)
#define clr(x, y) memset(x, y, sizeof x)
#define ll long long
#define ull unsigned long long
#define for(i,a,b) \
for(i=a;a=b;astruct sad
sad(int v)
sad operator +(const sad &b)const
c.ans2 = max(ans2,b.ans2);
c.l2 = l2;
c.r2 = b.r2;
if( vr > b.vl )
return c;
}sad rev()
};const
int maxn = 1e5+30;
struct edheg[maxn<<1];
int h[maxn],si;
void add(int u,int v)
int siz[maxn],dep[maxn];
int fa[maxn],son[maxn],top[maxn];
void dfs1(int u,int f,int d)
}int val[maxn];
sad rs[maxn<<2];
void pushup(int rt)
void build(int l,int r,int rt)
int m=l+r>>1;
build(lson);
build(rson);
pushup(rt);
}sad query(int l,int r,int l,int r,int rt)
int query(int u,int v)
// printf("f1 %d u %d\n",f1,u);
ans1 = query(p[f1],p[u],1,pos-1,1) + ans1;
u=fa[f1];
f1=top[u];
}if( dep[u] > dep[v] )
// printf("v %d u %d\n",v,u);
ans2 = query(p[u],p[v],1,pos-1,1) +ans2;
sad ans = ans1.rev() +ans2;
if(!r) return ans.ans1;
else
return ans.ans2;
}void init()
int main()
dfs1(1,-1,1);
dfs2(1,1);
build(1,pos-1,1);
scanf("%d",&q);
printf("case #%d:\n",++case);
for(int i=0;iscanf("%d%d",&u,&v);
printf("%d\n",query(u,v));}}
return
0;}
樹鏈剖分 樹鏈剖分講解
好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...
HDU3966 樹鏈剖分
題目 aragorn s story 題意 給一棵樹,並給定各個點權的值,然後有3種操作 i c1 c2 k 把c1與c2的路徑上的所有點權值加上k d c1 c2 k 把c1與c2的路徑上的所有點權值減去k q c 查詢節點編號為c的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...
hdu5029 樹鏈剖分
這題絕對好題。題意很簡單,也很容易想到樹鏈剖分,之後就不太好做了。開始想的是按顏色排序,然後每次處理一種顏色,求出最優解。這樣做的話,最壞情況會退化到n 2,不可接受。之後用線段樹維護,乙個節點只存在一種顏色,而且排序之後能保證在樹中顏色不會交叉,pushdown的時候可以將兩種都不是當前正在處理的...