比賽 NOIP2018 旅行

2022-05-25 10:42:12 字數 1602 閱讀 7489

發現 \(m\) 只有兩種取值,於是可做了

樹的直接貪心

圖的列舉環上的邊去掉,然後做樹的貪心,搜的時候剪一下枝吧

寫得有點亂

#include#define ui unsigned int

#define ll long long

#define db double

#define ld long double

#define ull unsigned long long

#define ft first

#define sd second

#define pb(a) push_back(a)

#define mp(a,b) std::make_pair(a,b)

#define rep(a,b,c) for(register int a=(b),a##end=(c);a<=a##end;++a)

#define dep(a,b,c) for(register int a=(b),a##end=(c);a>=a##end;--a)

const int maxn=5000+10;

int n,m,e=1,key,beg[maxn],nex[maxn<<1],to[maxn<<1],was[maxn<<1],cnt,dfn[maxn],ans[maxn],vis[maxn],arv[maxn];

std::vectorv[maxn];

std::pairext,from[maxn];

struct unique

inline int found(int x)

inline int link(int x,int y,int val) };

unique u;

templateinline void read(t &x)

templateinline void write(t x,char ch='\0')

templateinline bool chkmin(t &x,t y)

templateinline t min(t x,t y)

inline void insert(int x,int y,int z)

inline void sortdfs(int x,int f)

inline void initdfs(int x,int f)

inline bool dfs(int x,int f,int &fl)

inline int lca(int u,int v)

inline void solve(int x)

}int main()

if(m==n-1)sortdfs(1,0),dfs(1,0,fl=1),memcpy(ans,dfn,sizeof(ans));

else

rep(i,1,n)write(ans[i],i==iend?'\n':' ');

return 0;

}

NOIp 2018 旅行 題解

題目傳送門 題目大意 現在有一棵樹或一張只有乙個環的圖 連通 要求遍歷一遍這個圖,遍歷的順序即為乙個長度為 n nn 的序列,要求字典序最小的序列。假如是一棵樹的話,顯然貪心即可,從 1 11 出發,每次往編號小的走就好了。假如只是多一條邊的話,列舉刪掉那一條邊,然後變成一棵樹來做。因為每次都要往編...

比賽遊記 NOIP2018遊記

往期回顧 比賽遊記 noip2017遊記 轉眼間又過去了一年,當年還是初中生的我已經搖身一變成為了ahsofnu的高一學生。回顧這一年我好像也沒學什麼新東西,要說有用的可能就無旋treap吧,不知道能不能在noip上起到作用。noip2018 rp 普及組是沒去了,聽說普及很難,我看了看好像也沒啥 ...

比賽 NOIP2018 鋪設道路

原題,而且還是ccf自己的 考慮對於一段最長不上公升序列,無論如何都至少有序列第乙個數的貢獻,可以知道,這個貢獻是可以做到且最少的 然後對於序列最後一位,也就是最小的那乙個數,可以和後面序列拼起來的就拼起來,所以後面的序列需要補償的貢獻就是差分 簡化一下,ans sum n max include ...