2023年10月24日提高組 T3 TRAVEL

2021-08-30 02:39:22 字數 1768 閱讀 2542

給定每個點之間連線道路的限制l,r

l,rl,

r,求出從1到n

nn可以帶走最大的區間,如果有多組解,輸出字典序最小的一組

首先很容易想到dfs

dfsdf

s

#include

#include

#include

#define ri register int

using

namespace std;

int n,m,head[

1001

],tot,x,y,l,r,ansl,ansr;

struct node

;vectore[

6001];

bool vis[

1001];

inline

void

dfs(ri x,ri l,ri r)

//計算所有從1到n的路,求答案

return;}

for(ri i=

0;i.size()

;i++)}

return;}

signed

main()

);e[y]

.push_back

((node));

} vis[1]

=true

;dfs(1

,1,1000000);

printf

("%d\n"

,ansr-ansl+1)

;for

(ri i=ansl;i<=ansr;i++

)printf

("%d "

,i);

}

於是愉快的tle

tletl

e了我們想到了一種固定邊界的方法,假設我們列舉左邊界,然後二分右邊界,然後用一種演算法判斷是否可行(本人用的是並查集),但是這樣的複雜度是o(1

06lo

g1012

)o(10^6log10^)

o(106l

og10

12)會tle

tletl

e 然後我們發現左右邊界永遠都是所有路中的,於是我們可以只列舉出現的左右邊界,複雜度為o(m

2)

o(m^2)

o(m2

)可以過

#include

#include

#define ri register int

using

namespace std;

int f[

1001

],n,m,ans,ansl,l,r;

struct nodea[

3001];

inline

intfind

(ri x)

//並查集

inline

bool

cmp(node x,node y)

//排序

inline

void

check

(ri x)

//判斷是否可以到達

} r=

-1000000000

;return

;//沒找到

}signed

main()

}printf

("%d\n"

,ans)

;for

(ri i=ansl;i)printf

("%d "

,i);

//輸出

}

2023年10月29日提高組 T1 A

n nn個球,m mm個盤,盤子不能空,求本質上不相同的方案數 首先深搜 include using namespace std int n,m,ans inline void dfs register int dep,register int sy,register int last 分完了,統計...

2023年10月30日提高組 T1 A

求樹上聯通快中最大值與最小值之差為k kk的方案數 設最大值與最小值之差為xxx x xx正好為k kk的方案數 x k x leq k x k 的方案數 x x k的方案數 於是我們就可以樹形dpdp dp啦fi fs on 1 f i prod f 1 fi fson 1 include def...

2023年10月31日提高組 T1 A

求n nn的排列了交換為公升序的最小交換次數的期望 兩種思路 暴力打表找規律 動態規劃 第一種只需要打乙個bfs bfsbf s hash hash hash include include define p 10000007 using namespace std int n,ans struct...