From 5df1af750537d01fa6601f9cb0f7e47671fddb8c Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Wed, 2 Oct 2024 00:00:28 +0800 Subject: [PATCH] update --- P2615/P2615.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++- P2661/main.cpp | 49 ++++++++++++++++++------------------------------- 2 files changed, 60 insertions(+), 32 deletions(-) diff --git a/P2615/P2615.cpp b/P2615/P2615.cpp index 6bc7ecd..06a6e48 100644 --- a/P2615/P2615.cpp +++ b/P2615/P2615.cpp @@ -1,10 +1,51 @@ #include #include +#include using std::cin,std::cout; +static constexpr const auto range = std::ranges::views::iota; + +const int MAX_N = 39+5; +int n; +int map[MAX_N][MAX_N]; +int x,y,now{1}; int main(){ std::iostream::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr); - + std::cin>>n; + x=1,y=n/2+1; + + map[x][y]=now++; + + /* + 1. 若 $(K-1)$ 在第一行但不在最后一列,则将 $K$ 填在最后一行, $(K-1)$ 所在列的右一列; + 2. 若 $(K-1)$ 在最后一列但不在第一行,则将 $K$ 填在第一列, $(K-1)$ 所在行的上一行; + 3. 若 $(K-1)$ 在第一行最后一列,则将 $K$ 填在 $(K-1)$ 的正下方; + 4. 若 $(K-1)$ 既不在第一行,也不在最后一列,如果 $(K-1)$ 的右上方还未填数,则将 $K$ 填在 $(K-1)$ 的右上方,否则将 $K$ 填在 $(K-1)$ 的正下方。 + */ + while(now<=n*n){ + if(x==1 && y!=n){ + x=n,y++; + }else if(y==n && x!=1){ + y=1,x--; + }else if(x==1 && y==n){ + x++; + }else if(x!=1 && y!=n){ + if(map[x-1][y+1]==0){ + x--; + y++; + }else{ + x++; + } + } + map[x][y]=now++; + } + + for(int i:range(1,n+1)){ + for(int j:range(1,n+1)){ + std::cout< #include #include -#include +#include using std::cin,std::cout; const int MAX_N {(int)2e5+5}; int n; -std::vector next[MAX_N]; +int next[MAX_N]; int in_degree[MAX_N]; bool vis[MAX_N]; std::queue q; -int ans; -int input; - -int dfs(const int start, const int now, int depth){ - depth++; - vis[now] = true; - int max_depth{ depth }; - for (int i : next[now]) { - if (i == start) { - max_depth = std::max(max_depth, depth); - } - else { - max_depth = std::max(dfs(start, i, depth), max_depth); - } - } - return max_depth; -}; +int ans {std::numeric_limits::max()}; int main(){ - std::iostream::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr); + std::iostream::sync_with_stdio(false),cin.tie(0),cout.tie(0); std::cin>>n; for(int i=1;i<=n;i++){ - cin>>input; - in_degree[input]++; - next[i].push_back(input); + cin>>next[i]; + in_degree[next[i]]++; } const auto push_vis = [](int n){ q.push(n); @@ -51,17 +34,21 @@ int main(){ while(q.empty()==false){ int front = q.front(); q.pop(); - for(int i:next[front]){ - if(--in_degree[i]<=0){ - push_vis(i); - } + if(--in_degree[next[front]]<=0){ + push_vis(next[front]); } - } - for(int i=1;i<=n;i++){ if(vis[i])continue; - ans=std::max(ans,dfs(i,i,0)); + int loop_size {0}; + int start {i}; + int now {start}; + do{ + vis[now]=true; + now=next[now]; + loop_size++; + }while(now!=start); + ans=std::min(ans,loop_size); } - cout<