BZOJ4719 Noip2016 天天愛跑步

2021-07-24 19:34:35 字數 1349 閱讀 7459

考慮鏈上做法,發現就是把每個路徑拆成一次加入和一次刪除,然後從前往後掃,走一步所有路徑經過當前點的時間就要麼加一,要麼減一,且要麼是一直加一,要麼是一直減一,可以用兩個陣列和指標來維護整體加減

用鏈剖把乙個區間轉換成o(log n)個區間,即可在樹上做

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define maxn 300010

#define maxm 1010

#define ll long long

#define eps 1e-8

#define inf 1000000000

#define mod 1000000007

struct vec;

struct data

data(int _s,int _f,int _o)

};int read()

} while(1)

re=re*10+c-'0';

} return re;

}vectorc[maxn];

vec mp[maxn*2];

int tai[maxn],cnt;

int fa[maxn],son[maxn],dep[maxn],siz[maxn],tp[maxn],dfn[maxn],ndf[maxn],tim;

int w[maxn];

int n,m;

int ct1[maxn*4],ct2[maxn*4];

int *ct1=ct1+maxn*2+5,*ct2=ct2+maxn*2+5;

int ans[maxn];

inline void be(int x,int y)

inline void bde(int x,int y)

void dfs1(int x)

} }}void dfs2(int x,int z)

} }}int dis(int x,int y)

re+=dep[y]-dep[x];

return re;

}void change(int x,int y,int dx,int dy)

c[dfn[x]].push_back(data(dy+(dep[y]-dep[x])*fy,fx,1));

c[dfn[y]+1].push_back(data(dy-fy,fx,-1));

}int main(){

int i,j,x,y;

n=read();

m=read();

for(i=1;i

BZOJ4719 Noip2016 天天愛跑步

小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步?是乙個養成類遊戲,需要 玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 n個結點和n 1 條邊的樹,每條邊連線兩 個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從1到n的連續正整數。現在有個...

NOIP2016 bzoj4719天天愛跑步

小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步 是乙個養成類遊戲,需要玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 n n個結點和 n 1n 1條邊的樹,每條邊連線兩個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從11到n n的連續正整...

bzoj4719 Noip2016 天天愛跑步

description 小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步?是乙個養成類遊戲,需要 玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 n個結點和n 1 條邊的樹,每條邊連線兩 個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從1到...