Link:

传送门

A:

贪心从小到大插入,用并查集维护连通性

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e3+;
int n,tot,cnt,f[MAXN];P dat[MAXN];
struct edge{int x,y;ll w;}e[MAXN*MAXN]; ll sqr(int x){return 1ll*x*x;}
bool cmp(edge x,edge y){return x.w<y.w;}
int find(int x){return f[x]==x?x:f[x]=find(f[x]);} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&dat[i].X,&dat[i].Y),f[i]=i;
for(int i=;i<n;i++)
for(int j=i+;j<=n;j++)
e[++tot]={i,j,sqr(dat[i].X-dat[j].X)+sqr(dat[i].Y-dat[j].Y)};
sort(e+,e+tot+,cmp); cnt=n;
for(int i=;i<=tot;i++)
{
int px=find(e[i].x),py=find(e[i].y);
if(px!=py) f[px]=py,cnt--;
if(cnt==) return printf("%lld",e[i].w),;
}
return ;
}

Problem A

B:

$dp[1...n][1...m][0/1]$,其中0/1表示当前在哪一边

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e3+,INF=0x3f3f3f3f;
ll dp[MAXN][MAXN][];
int n,m;P dat[MAXN*]; ll sqr(int x){return 1ll*x*x;}
ll dist(int a,int b){return sqr(dat[a].X-dat[b].X)+sqr(dat[a].Y-dat[b].Y);} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n+m;i++)
scanf("%d%d",&dat[i].X,&dat[i].Y); memset(dp,0x3f,sizeof(dp));
dp[][][]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;k<;k++)
{
if(i) dp[i+][j][]=min(dp[i+][j][],dp[i][j][]+dist(i,i+));
if(j) dp[i+][j][]=min(dp[i+][j][],dp[i][j][]+dist(n+j,i+));
if(i) dp[i][j+][]=min(dp[i][j+][],dp[i][j][]+dist(i,n+j+));
if(j) dp[i][j+][]=min(dp[i][j+][],dp[i][j][]+dist(n+j,n+j+));
}
printf("%lld",dp[n][m][]);
return ;
}

Problem B

C:

可以明显发现是最短路模型,但如果将一个点能不转弯走到的所有点的边都连上明显$TLE$

那么在跑最短路时多记录一维当前方向即可,每次转移判断是否要转向来决定是否增加代价

这样只要与不穿过其他点就能到达的点连边就行了

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+,INF=0x3f3f3f3f;
int n,x,y,h1[MAXN],h2[MAXN],dist[MAXN][],tot;
struct edge{int nxt,to;}e1[MAXN<<],e2[MAXN<<];
struct node{int x,y,id;}tmp[MAXN],dat[MAXN];
struct Queue{int w,x,dir;}; bool cmp1(node a,node b){return a.x<b.x;}
bool cmp2(node a,node b){return a.y<b.y;}
bool operator < (Queue a,Queue b){return a.w>b.w;}
void add1(int x,int y)
{
e1[++tot]={h1[x],y};h1[x]=tot;
e1[++tot]={h1[y],x};h1[y]=tot;
}
void add2(int x,int y)
{
e2[++tot]={h2[x],y};h2[x]=tot;
e2[++tot]={h2[y],x};h2[y]=tot;
}
priority_queue<Queue> q; int main()
{
scanf("%d",&n);n+=;
scanf("%d%d",&x,&y);dat[]=tmp[]={x,y,};
scanf("%d%d",&x,&y);dat[n]=tmp[n]={x,y,n};
for(int i=;i<n;i++)
scanf("%d%d",&dat[i].x,&dat[i].y),dat[i].id=i,tmp[i]=dat[i]; sort(tmp+,tmp+n+,cmp1);
for(int i=;i<n;i++)
if(tmp[i].x==tmp[i+].x)
add1(tmp[i].id,tmp[i+].id);
sort(tmp+,tmp+n+,cmp2);
for(int i=;i<n;i++)
if(tmp[i].y==tmp[i+].y)
add2(tmp[i].id,tmp[i+].id); memset(dist,0x3f,sizeof(dist));
dist[][]=dist[][]=;
q.push(Queue{,,});q.push(Queue{,,});
while(!q.empty())
{
Queue t=q.top();q.pop();
if(dist[t.x][t.dir]<t.w) continue; for(int i=h1[t.x];i;i=e1[i].nxt)
if(dist[e1[i].to][]>dist[t.x][t.dir]+(t.dir!=))
dist[e1[i].to][]=dist[t.x][t.dir]+(t.dir!=),q.push(Queue{dist[e1[i].to][],e1[i].to,});
for(int i=h2[t.x];i;i=e2[i].nxt)
if(dist[e2[i].to][]>dist[t.x][t.dir]+(t.dir!=))
dist[e2[i].to][]=dist[t.x][t.dir]+(t.dir!=),q.push(Queue{dist[e2[i].to][],e2[i].to,});
}
int res=min(dist[n][],dist[n][]);
printf("%d",res==INF?-:res);
return ;
}

Problem C

不过看了题解发现由于:

1、同一行/列可以直达任一点

2、每次代价增加必然是行列间转化

从而也可以仅考虑坐标,离散化后对于点$(x,y)$将$x$行和$y$列连边即可

最新文章

  1. [从产品角度学EXCEL 03]-单元格的秘密
  2. Visual Studio 下C#编译器在解析属性名时如果增加一个get_[您的另一个已经包含在类中属性名]的属性会报错,微软大哥这是什么鬼?
  3. MySQL的Explain命令
  4. finereport普通报表的移动端自适应方案
  5. iOS开发中的错误整理,iOS9之后的UIWindow(TopWindow)以及UIWindow与statusBar的关系
  6. python range() 和xrange()的区别
  7. Tushare的安装
  8. Logistic回归的牛顿法及DFP、BFGS拟牛顿法求解
  9. 线段树(区间合并) POJ 3667 Hotel
  10. angularJS $watch $digest $apply
  11. apache的用户认证
  12. python黑科技:还在为没有wifi而烦心吗?这篇文章解决你的困扰
  13. shell实战之日志脱敏
  14. 前台js根据当前时间生成订单号
  15. HibernateValidators
  16. Maven不能下载SNAPSHOT包但是能下载RELEASE包的解决办法
  17. c++有关构造函数、析构函数和类的组合的一个简单例子
  18. 一脸懵逼学习keepalived(对Nginx进行热备)
  19. Oracle 事务和异常处理
  20. JDK7+EclipseIDE+Tomcat7.0.55++mybatis3+Maven3.2.2 构建webapp 的java 的maven项目

热门文章

  1. BigDecimal的用法详解
  2. Android控件——ToggleButton多状态按钮(实现灯泡的开关)
  3. 破解邻居家的wifi密码
  4. 【Python学习笔记】异常处理try-except
  5. 【Python学习】程序运行完发送邮件提醒
  6. linux dpm机制分析(上)【转】
  7. ue4.3正式版源码链接
  8. linux 命令行远程登录 后台运行命令的方法
  9. Chrome控制台的妙用之使用XPATH
  10. Python的数值和字符串