時間限制:c/c++ 1秒,其他語言2秒
空間限制:c/c++ 131072k,其他語言262144k
64bit io format: %lld
題目描述
珂朵莉給你乙個有根樹,求有多少個子樹滿足其內部節點編號在值域上連續
一些數在值域上連續的意思即其在值域上構成乙個連續的區間
輸入描述:
第一行有乙個整數n,表示樹的節點數。
接下來n–1行,每行兩個整數x,y,表示存在一條從x到y的有向邊。
輸入保證是一棵有根樹。
輸出描述:
輸出乙個數表示答案
示例1
輸入 5
2 3
2 1
2 4
4 5
輸出 5
說明 節點1子樹中編號為1,值域連續
節點3子樹中編號為3,值域連續
節點5子樹中編號為5,值域連續
節點4子樹中編號為4,5,值域連續
節點2子樹中編號為1,2,3,4,5,值域連續
備註:
對於100%的資料,有n <=100000
分析:乙個子樹值域連續當且僅當其子樹max-min+1=size
dfs1.手動構造樹
#include
using
namespace
std;
#define mem(a,n) memset(a,n,sizeof(a))
#define rep(i,a,n) for(int i=a;i#define pb push_back
#define fi first
#define se second
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
double eps=1e-6;
const
int inf=0x3f3f3f3f;
const
int n=1e5+5;
int ans,mx[n],mn[n],sz[n],cnt;
bool vis[n];
int head[n];
struct edge
e[n];
void addedge(int u,int v)
; head[u]=cnt;
}void dfs(int rt,int f)
if(mx[rt]-mn[rt]+1==sz[rt]) ans++;
}int main()
rep(i,1,n+1)
}printf("%d\n",ans);
}return
0;}
2.使用vector
#include
using
namespace
std;
#define mem(a,n) memset(a,n,sizeof(a))
#define rep(i,a,n) for(int i=a;i#define pb push_back
#define fi first
#define se second
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
double eps=1e-6;
const
int inf=0x3f3f3f3f;
const
int n=1e5+5;
int ans,mx[n],mn[n],sz[n];
bool vis[n];
vector
e[n];
void dfs(int rt)
if(mx[rt]-mn[rt]+1==sz[rt]) ans++;
}int main()
int root;
rep(i,1,n+1)
if(!vis[i])
printf("%d\n",ans);
}return
0;}
珂朵莉的值域連續段
珂朵莉的值域連續段 時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 題目描述 珂朵莉給你乙個有根樹,求有多少個子樹滿足其內部節點編號在值域上連續 一些數在值域上連續的意思即其在值域上構成乙個連續的區間 輸入描述 ...
牛客練習賽9 B 珂朵莉的值域連續段
一定要注意題目中的 連續 即只需要記錄子樹中的三個要素 最小值min 最大值max和節點個數size 做個dfs遍歷一遍樹,每棵樹的節點size等於本身1 全部子樹的size,max min也是本身與全部子樹的max min比較 include include include include inc...
校門外的樹 珂朵莉樹
題目描述 某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是11公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸00的位置,另一端在ll的位置 數軸上的每個整數點,即0,1,2,l0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表...