珂朵莉的值域連續段

2021-10-10 16:48:06 字數 1617 閱讀 7103

珂朵莉的值域連續段

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 131072k,其他語言262144k

64bit io format: %lld

題目描述

珂朵莉給你乙個有根樹,求有多少個子樹滿足其內部節點編號在值域上連續

一些數在值域上連續的意思即其在值域上構成乙個連續的區間

輸入描述:

第一行有乙個整數n,表示樹的節點數。

接下來n–1行,每行兩個整數x,y,表示存在一條從x到y的有向邊。

輸入保證是一棵有根樹。

輸出描述:

輸出乙個數表示答案

示例1輸入複製5

2 32 1

2 44 5

輸出複製5說明

節點1子樹中編號為1,值域連續

節點3子樹中編號為3,值域連續

節點5子樹中編號為5,值域連續

節點4子樹中編號為4,5,值域連續

節點2子樹中編號為1,2,3,4,5,值域連續

備註:對於100%的資料,有n <=100000

學演算法半年載,一直沒有接觸圖與樹,今天開始涉獵樹,希望』樹先生』手下留情,輕點虐我。

該題應該怎麼做吶,我們分析一波,看看《有多少個子樹滿足其內部節點編號在值域上連續

一些數在值域上連續的意思即其在值域上構成乙個連續的區間》這句話的意思。意思是加上自己和所有的子樹,最大值減去最小值如果等於結點個數就代表其是連續的,就是符號題意的。dfs就可以了。還是比較簡單的。當然我也是借鑑別人的**才看懂的,我自己就是乙個小菜雞。

#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<

int>e[n]

;void

dfs(

int rt)

if(mx[rt]

-mn[rt]+1

==sz[rt]

) ans++;}

intmain()

int root;

rep(i,

1,n+1)

if(!vis[i]

)//防止重複遍歷

printf

("%d\n"

,ans);}

return0;

}

珂朵莉的值域連續段(有向樹,dfs)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 題目描述 珂朵莉給你乙個有根樹,求有多少個子樹滿足其內部節點編號在值域上連續 一些數在值域上連續的意思即其在值域上構成乙個連續的區間 輸入描述 第一行有乙個整數n,...

牛客練習賽9 B 珂朵莉的值域連續段

一定要注意題目中的 連續 即只需要記錄子樹中的三個要素 最小值min 最大值max和節點個數size 做個dfs遍歷一遍樹,每棵樹的節點size等於本身1 全部子樹的size,max min也是本身與全部子樹的max min比較 include include include include inc...

珂朵莉的約數

珂朵莉給你乙個長為n的序列,有m次查詢 每次查詢給兩個數l,r 設s為區間 l,r 內所有數的乘積 求s的約數個數mod 1000000007 輸入描述 第一行兩個正整數n,m 第二行乙個長為n的序列 之後m行每行兩個數l和r 輸出描述 對於每個詢問,輸出乙個整數表示答案 示例1輸入 複製5564 ...