TJOI2015 旅遊 樹鏈剖分神題

2021-09-02 11:40:05 字數 2479 閱讀 6175

傳送門

第一眼看是樹剖加鏈上最大最小 , 但必須保證最小出現在最大之前

於是我們考慮直接維護乙個區間最大最小的差 (保證最小在最大之前)

我們發現,這個差就是

等等,我們從下往上走和從上往下方向不同(廢話)

也就是說我們從下往上要用的是上面的最大-下面的最小

反之則是下面的最大-上面的最小

於是我們考慮維護兩個(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操作 考慮第二個...