給定每個點之間連線道路的限制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...