大都市(樹剖)

2022-05-09 08:33:13 字數 3451 閱讀 3095

輸入格式

若這行為a a,b,則表示a,b這條邊被改造成公路;

若這行為w,a, 則表示bluemary曾經從位元堡送信到村莊a.

輸出格式

有m行,每行包含乙個整數,表示對應的某次送信時經過的土路數目。

樣例樣例輸入

5

1 21 3

1 44 5

4w 5

a 1 4

w 5a 4 5

w 5w 2

a 1 2

a 1 3

樣例輸出

210

1思路類似樹剖,但稍微簡單

1 #include2 #include3 #include4

using

namespace

std;

5const

int maxn=250000+10;6

int lazy[maxn<<2],tree[maxn<<2];7

struct

edgee[maxn<<1

];10

int head[maxn],tot=0;11

void insert(int a,int

b)16

int top=0;17

intdeep[maxn],size[maxn],num[maxn];

18void dfs(int u,int

fa)27}28

void pushup(int

rt)31

void modify(int rt,int l,int r,int x,int

w)36

int mid=(l+r)>>1;37

if(x<=mid) modify(rt<<1

,l,mid,x,w);

38else modify(rt<<1|1,mid+1

,r,x,w);

39pushup(rt);40}

41void update(int rt,int l,int r,int

w)45

void pushdown(int rt,int l,int

r)51

int query(int rt,int l,int r,int

x)55

pushdown(rt,l,r);

56int mid=(l+r)>>1;57

if(x<=mid) return query(rt<<1

,l,mid,x);

58else

return query(rt<<1|1,mid+1

,r,x);59}

60void modify1(int rt,int l,int r,int s,int t,int

w)65

int mid=(l+r)>>1;66

if(s<=mid) modify1(rt<<1

,l,mid,s,t,w);

67if(t>mid) modify1(rt<<1|1,mid+1

,r,s,t,w);

68pushup(rt);69}

70int

main()

79for(int i=1;i<=n;i++) size[i]=1

;80 dfs(1,0

);81

for(int i=1;i<=n;i++) modify(1,1,n,num[i],deep[i]-1

);82

intm;

83 scanf("

%d",&m);

84for(int i=1;i<=n+m-1;i++)

93else99}

100return0;

101 }

view code

1 #include2 #include3 #include4

using

namespace

std;

5const

int maxn=250000+10;6

int lazy[maxn<<2],tree[maxn<<2];7

struct

edgee[maxn<<1

];10

int head[maxn],tot=0;11

void insert(int a,int

b)16

int top=0;17

intdeep[maxn],size[maxn],num[maxn];

18void dfs(int u,int

fa)27}28

void pushup(int

rt)31

void modify(int rt,int l,int r,int x,int

w)36

int mid=(l+r)>>1;37

if(x<=mid) modify(rt<<1

,l,mid,x,w);

38else modify(rt<<1|1,mid+1

,r,x,w);

39pushup(rt);40}

41void update(int rt,int l,int r,int

w)45

void pushdown(int rt,int l,int

r)51

int query(int rt,int l,int r,int

x)55

pushdown(rt,l,r);

56int mid=(l+r)>>1;57

if(x<=mid) return query(rt<<1

,l,mid,x);

58else

return query(rt<<1|1,mid+1

,r,x);59}

60void modify1(int rt,int l,int r,int s,int t,int

w)65

int mid=(l+r)>>1;66

if(s<=mid) modify1(rt<<1

,l,mid,s,t,w);

67if(t>mid) modify1(rt<<1|1,mid+1

,r,s,t,w);

68pushup(rt);69}

70int

main()

79for(int i=1;i<=n;i++) size[i]=1

;80 dfs(1,0

);81

for(int i=1;i<=n;i++) modify(1,1,n,num[i],deep[i]-1

);82

intm;

83 scanf("

%d",&m);

84for(int i=1;i<=n+m-1;i++)

93else99}

100return0;

101 }

view code