BZOJ2157 旅遊,樹鏈剖分練習

2021-07-10 18:26:44 字數 2519 閱讀 6398

傳送門

寫在前面:模擬賽中ca爺卡我記憶體,暴力100變60……不過還是親學長(畢竟在我初中的時候就是學長),每次做ca爺的題都是高分……

思路:

(迄今做的最爽的樹鏈剖分)

被char哥帶著做這道題,結果耗了好久時間調好,這應該是第一次寫邊鏈剖了?與點鏈剖不同的是要處理下邊(深度大的變成入點),然後建樹時,這個入點的權值就是邊的權值(根的權值為0)。查詢時,最後l,r到同一條鏈上來,要讓l賦為l的重兒子,然後再求值(如果l,r是同乙個點就直接退出,不用賦值重兒子了,因為相同的點之間沒有路徑權值)

其他就是簡單的加標記求最大最小與總和了,這個題多一步取反操作,直接打標記,最大值最小值交換,然後最大最小與總和全部取相反數就行了

注意:讀入判斷命令要注意……

**:

#include#define inf 0x7fffffff

using namespace std;

int n,m,tot,cnt;

char ch;

int val[20010],l[20010],first[20010],pre[20010],dep[20010],siz[20010],top[20010],fa[20010],son[20010];

struct edge

e[40010];

struct node

tree[100010];

void add(int x,int y,int z)

void dfs1(int

now)

}void dfs2(int

now,int tp)

void pushdown(int

now)

void pushup(int

now)

void build(int

now,int begin,int

end)

intmid=(begin+end)>>1;

build(now

<<1,begin,mid);

build(now

<<1|1,mid+1,end);

pushup(now);

}void update(int

now,int begin,int

end,int pos,int num)

pushdown(now);

intmid=(begin+end)>>1;

if (mid>=pos) update(now

<<1,begin,mid,pos,num);

else update(now

<<1|1,mid+1,end,pos,num);

pushup(now);

}void oppo(int

now,int begin,int

end,int l,int r)

pushdown(now);

intmid=(begin+end)>>1;

if (mid>=l) oppo(now

<<1,begin,mid,l,r);

if (mid

now<<1|1,mid+1,end,l,r);

pushup(now);

}int get_max(int

now,int begin,int

end,int l,int r)

int get_min(int

now,int begin,int

end,int l,int r)

int get_sum(int

now,int begin,int

end,int l,int r)

void solve(int l,int r)

if (dep[l]>dep[r]) swap(l,r);

if (l==r)

if (ch=='i')

if (ch=='a')

}l=son[l];

if (ch=='n') oppo(1,1,cnt,l[l],l[r]);

else

if (ch=='s') ans+=get_sum(1,1,cnt,l[l],l[r]),printf("%d\n",ans);

else

if (ch=='i') minn=min(minn,get_min(1,1,cnt,l[l],l[r])),printf("%d\n",minn);

else

if (ch=='a')maxn=max(maxn,get_max(1,1,cnt,l[l],l[r])),printf("%d\n",maxn);

}main()

build(1,1,cnt);

scanf("%d",&m);

while (m--)

else

if (ch=='s') getchar(),getchar();

else

if (ch=='m') ch=getchar(),getchar();

scanf("%d%d",&x,&y);

solve(x+1,y+1);

}}

BZOJ 2157 旅遊 樹鏈剖分

ray 樂忠於旅遊,這次他來到了t 城。t 城是乙個水上城市,一共有 n 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹窄泥...

BZOJ2157 旅遊 樹鏈剖分

ray 樂忠於旅遊,這次他來到了t 城。t 城是乙個水上城市,一共有 n 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹窄泥...

BZOJ2157旅遊 樹鏈剖分 線段樹

ray 樂忠於旅遊,這次他來到了t 城。t 城是乙個水上城市,一共有 n 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人心情愉悅,但有些橋狹窄泥...