5093 dfs序 線段樹 ,邊轉點

2021-07-23 16:42:39 字數 3171 閱讀 2121

題意:給你乙個樹,問你樹的路徑異或和為1的路徑樹。

wa了n次,後來dfs換成了另一種方式過了,再後來發現是自己忘記了rk陣列,還是不夠熟練,理解也不夠深,後來換成自己的方式過了, 附上兩個**。

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int n=30005;

struct node

edge[n*2];

map ma;

int in[n],out[n];

int head[n],cnt,tim,a[n];

pair q[n];

void add(int u,int v ,int w)

void dfs(int u,int pre,int w)

out[u]=tim;

}#define ls l,mid,rt<<1

#define rs mid+1,r,rt<<1|1

int sum[n<<2],lazy[n<<2];

void up(int rt)

void down(int rt,int l,int r)

}void build(int l,int r,int rt)

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

build(ls);

build(rs);

up(rt);

}void update(int l,int r,int l,int r,int rt)

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

down(rt,l,r);

if(mid>=l) update(l,r,ls);

if(midint main()

for(int i=1;iscanf("%s%s%d",u,v,&w);

int id1=ma[(string)u],id2=ma[(string)v];

add(id1,id2,w);

add(id2,id1,w);

q[i]=make_pair(id1,id2);

}dfs(1,0,0);

build(2,n,1);

printf("case #%d:\n",cas);

int qq;

scanf("%d",&qq);

while(qq--)}}

}//11

//11

//a//b

//c//d

//e//f

//g//h

//i//j

//k//a b 1

//a c 1

//b d 1

//b e 0

//e h 1

//h i 0

//i j 1

//j k 0

//c f 0

//c g 1

//10

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int n=30005;

struct node

edge[n*2];

map ma;

int in[n],out[n];

int rk[n];

int head[n],cnt,tim,a[n];

pair q[n];

void add(int u,int v ,int w)

void dfs(int u,int pre)

}out[u]=tim;

}#define ls l,mid,rt<<1

#define rs mid+1,r,rt<<1|1

int sum[n<<2],lazy[n<<2];

void up(int rt)

void down(int rt,int l,int r)

}void build(int l,int r,int rt)

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

build(ls);

build(rs);

up(rt);

}void update(int l,int r,int l,int r,int rt)

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

down(rt,l,r);

if(mid>=l) update(l,r,ls);

if(midint main()

for(int i=1;iscanf("%s%s%d",u,v,&w);

int id1=ma[(string)u],id2=ma[(string)v];

add(id1,id2,w);

add(id2,id1,w);

q[i]=make_pair(id1,id2);

}a[1]=0;

dfs(1,0);

build(2,n,1);

for(int i=1;iint uu=q[i].first,vv=q[i].second;

if(in[uu]else q[i].first=uu;

}printf("case #%d:\n",cas);

int qq;

scanf("%d",&qq);

while(qq--)}}

}//11

//11

//a//b

//c//d

//e//f

//g//h

//i//j

//k//a b 1

//a c 1

//b d 1

//b e 0

//e h 1

//h i 0

//i j 1

//j k 0

//c f 0

//c g 1

//10

dfs序 線段樹

傳送門 現有一棵樹,有以下操作 1.節點x及其所有子孫顏色都變更為k。2.要求你回答節點x的顏色。初始所有點都沒有染色。input 第一行乙個整數t t 10 表示樣例組數。對於每個測試樣例 第一行乙個整數n n 5e4 表示樹的節點個數。接下來n行,每行兩個整數u,v 1 u,v n 表示樹中u的...

HDU snacks (線段樹 dfs序)

problem description input 輸入資料第一行是乙個整數,表示有組測試資料。對於每組資料,包含兩個整數,表示有個零食機,次操作。接下來行,每行兩個整數和,表示編號為的零食機與編號為的零食機相連。接下來一行由個數組成,表示從編號為0到編號為的零食機的初始價值。接下來行,有兩種操作 ...

求和(dfs序 線段樹)

題意 已知有n個節點,有n 1條邊,形成乙個樹的結構。給定乙個根節點k,每個節點都有乙個權值,節點i的權值為vi 給m個操作,操作有兩種型別 1 a x 表示將節點a的權值加上x 2 a 表示求a節點的子樹上所有節點的和 包括a節點本身 題解 dfs序 線段樹 用dfs序確定in x 和out x ...