【算法学习】二维转一维问题
1.【算法学习】排序2.【算法学习】Manacher 马拉车3.【算法学习】KMP 算法4.LCA 最近公共祖先(树链和倍增)这次真有树链了!!!5.线段覆盖问题6.【算法学习】学换根dp有感7.二分图最大匹配8.【算法学习】01BFS9.洛谷 P1892 [BOI2003] 团伙 种类并查集 扩展域并查集10.【算法学习】高斯消元法11.贝叶斯公式12.背包13.【算法学习】模拟退火14.【算法学习】基环树15.【算法学习】树链部分16.【算法学习】莫队17.【算法学习】分块九讲18.平衡树19.圆方树20.【算法学习】点分治21.公式22.【算法学习】笛卡尔树23.【算法学习】悬线法24.欧几里得算法与 EX25.【算法学习】逆元与求解26.【算法学习】费马定理27.三分28.裴蜀定理29.【算法学习】欧拉函数φ
30.【算法学习】二维转一维问题
31.【算法学习】扫描线32.【算法学习】矩阵乘法33.【算法学习】同余最短路34.【算法学习】组合数学35.【算法学习】反悔贪心P3073 [USACO13FEB] Tractor S
将二维的点赋予一个编号,转化为一维的问题,然后二维建边后进行最小生成树即可。
#include <bits/stdc++.h> #define int long long #define ls p<<1 #define rs p<<1|1 #define fi first #define se second #define re register #define pir pair<int,int> const int inf=1e9; const int mod=998244353; const int N=505; using namespace std; int n; int mp[N][N]; struct ss{ int u,v,w; }a[N*N*4]; int get(int x,int y){ return (x-1)*n+y; } bool cmp(ss g,ss h){ return g.w<h.w; } int fa[N*N*4]; int siz[N*N*4]; int find(int x){ if(fa[x]==x){ return x; } return fa[x]=find(fa[x]); } signed main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>mp[i][j]; } } for(int i=1;i<=n*n;i++){ fa[i]=i; siz[i]=1; } int cnt=1; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i>1){ a[cnt]={get(i,j),get(i-1,j),abs(mp[i][j]-mp[i-1][j])}; cnt++; } if(j>1){ a[cnt]={get(i,j),get(i,j-1),abs(mp[i][j]-mp[i][j-1])}; cnt++; } if(i<n){ a[cnt]={get(i,j),get(i+1,j),abs(mp[i][j]-mp[i+1][j])}; cnt++; } if(j<n){ a[cnt]={get(i,j),get(i,j+1),abs(mp[i][j]-mp[i][j+1])}; cnt++; } } } cnt--; sort(a+1,a+cnt+1,cmp); for(int i=1;i<=cnt;i++){ int x=a[i].u,y=a[i].v; int w=a[i].w; x=find(x); y=find(y); if(x!=y){ fa[x]=y; siz[y]+=siz[x]; if(siz[y]>=(n*n+1)/2){ cout<<w; return 0; } } } return 0; }
P1653 [USACO04DEC] Cow Ski Area G
同样的这题也是要转化,转化后跑tarjan缩点,统计入度为0的点和出度为0的点哪个多。
输出多的那个答案。
#include <bits/stdc++.h> #define int long long #define ls p<<1 #define rs p<<1|1 #define fi first #define se second #define re register #define pir pair<int,int> const int inf=1e9; const int mod=998244353; const int N=2000005; using namespace std; int n,m; int mp[505][505]; int uu[N],vv[N]; vector<int> v[N]; int get(int x,int y){ return (x-1)*m+y; } int dfn[N],low[N],st[N],vis[N],top,t,tot,of[N]; void tarjan(int x){ dfn[x]=low[x]=++t; st[++top]=x; vis[x]=1; for(int i=0;i<v[x].size();i++){ int y=v[x][i]; if(!dfn[y]){ tarjan(y); low[x]=min(low[x],low[y]); } else if(vis[y]==1){ low[x]=min(low[x],dfn[y]); } } if(dfn[x]==low[x]){ int b=-1; tot++; while(x!=b){ b=st[top--]; of[b]=tot; vis[b]=0; } } } int in[N],out[N]; signed main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin>>m>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>mp[i][j]; } } int cnt=1; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(i>1&&mp[i][j]>=mp[i-1][j]){ uu[cnt]=get(i,j),vv[cnt]=get(i-1,j); v[uu[cnt]].push_back(vv[cnt]); cnt++; } if(j>1&&mp[i][j]>=mp[i][j-1]){ uu[cnt]=get(i,j),vv[cnt]=get(i,j-1); v[uu[cnt]].push_back(vv[cnt]); cnt++; } if(i<n&&mp[i][j]>=mp[i+1][j]){ uu[cnt]=get(i,j),vv[cnt]=get(i+1,j); v[uu[cnt]].push_back(vv[cnt]); cnt++; } if(j<m&&mp[i][j]>=mp[i][j+1]){ uu[cnt]=get(i,j),vv[cnt]=get(i,j+1); v[uu[cnt]].push_back(vv[cnt]); cnt++; } } } cnt--; for(int i=1;i<=n*m;i++){ if(!dfn[i]){ tarjan(i); } } if(tot==1){ cout<<0; return 0; } for(int i=1;i<=cnt;i++){ int x=of[uu[i]],y=of[vv[i]]; if(x!=y){ in[y]++; out[x]++; } } int ans1=0,ans2=0; for(int i=1;i<=tot;i++){ if(in[i]==0){ ans1++; } if(out[i]==0){ ans2++; } } cout<<max(ans1,ans2); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)