傳送門
第一眼看是樹剖加鏈上最大最小 , 但必須保證最小出現在最大之前
於是我們考慮直接維護乙個區間最大最小的差 (保證最小在最大之前)
我們發現,這個差就是
等等,我們從下往上走和從上往下方向不同(廢話)
也就是說我們從下往上要用的是上面的最大-下面的最小
反之則是下面的最大-上面的最小
於是我們考慮維護兩個(lval,rval)
然後考慮樹剖時如何合併??
我們將最大最小存在陣列裡 , 然後o(個數^2)掃一遍更新ans
因為重鏈+輕鏈的個數為了方便 , 我們先處理x到lca的 , 再處理lca到y的
我們還需要記錄x到lca的最小, 與lca到y的最大,然後再打一下擂台
因為答案可能在兩條路徑上
//寫過的最長** (170)
#include#define n 50050
#define m n*2
#define ll long long
#define inf 0x3fffffff
using namespace std;
int first[n],next[m],to[m],tot;
int fa[n],son[n],id[n],dep[n];
int sign,top[n],siz[n],pre[n];
int n,a[n],m; ll ans,max[25],min[25],tmp;
struct nodet[n<<2];
void add(int x,int y)
void dfs1(int u,int f)
}void dfs2(int u,int top)
/*----------------------------------------線段樹-------------------------------------*/
void pushup(int x)
void pushdown(int x)
}void build(int x,int l,int r)
int mid=(l+r)>>1;
build(x<<1,l,mid),build(x<<1|1,mid+1,r);
pushup(x);
}void quary(int x,int l,int r,node &k)
pushdown(x);
int mid=(t[x].l+t[x].r)>>1;
if(l>mid) quary(x<<1|1,l,r,k);
else if(r<=mid) quary(x<<1,l,r,k);
else
}void update(int x,int l,int r,int val)
pushdown(x);
int mid=(t[x].l+t[x].r)>>1;
if(l<=mid) update(x<<1,l,r,val);
if(r>mid) update(x<<1|1,l,r,val);
pushup(x);
}/*-------------------------------------樹剖--------------------------------*/
int lca(int x,int y)
if(dep[x]<=dep[y]) swap(x,y);
return y;
}void q1(int x,int goal)
now.min=inf , now.max=now.lval=now.rval=0;
quary(1,id[goal],id[x],now);
ans = max(ans , now.rval);
max[++c1] = now.max;
min[c1] = now.min;
for(int i=1;i
for(int i=1;i<=c1;i++) tmp = min(tmp,min[i]);
}void q2(int x,int goal)
now.min=inf , now.max=now.lval=now.rval=0;
quary(1,id[goal],id[x],now);
ans = max(ans , now.lval);
max[++c1] = now.max;
min[c1] = now.min;
for(int i=1;i
for(int i=1;i<=c1;i++) ans = max(ans,max[i]-tmp);
}void update(int x,int y,int val)
if(dep[x]
update(1,id[y],id[x],val);
}int main()
dep[1]=1,dfs1(1,0),dfs2(1,1),build(1,1,n);
scanf("%d",&m); while(m--)return 0;
}
BZOJ 2157 旅遊 樹鏈剖分
ray 樂忠於旅遊,這次他來到了t 城。t 城是乙個水上城市,一共有 n 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹窄泥...
BZOJ2157 旅遊 樹鏈剖分
ray 樂忠於旅遊,這次他來到了t 城。t 城是乙個水上城市,一共有 n 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹窄泥...
洛谷1505 旅遊(樹鏈剖分)
一道裸的剖分被乙個極度sb的錯誤卡了兩天。題意很明顯,維護5個操作 單點修改,區間取相反數,區間求和,區間求最大值,區間求最小值。考慮第乙個操作,對於一條路徑,如果修改了他的權值,那麼只會對深度較淺的乙個點向下走 深度較深的向上走會產生影響,所以單點修改較深點權值。見 update1操作 考慮第二個...