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$列连边即可

[USACO 2016 Dec Gold] Tutorial的更多相关文章

  1. [USACO 2017 Dec Gold] Tutorial

    Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...

  2. [USACO 2018 Feb Gold] Tutorial

    Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...

  3. [USACO 2018 Jan Gold] Tutorial

    Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...

  4. Usaco 2010 Dec Gold Exercise(奶牛健美操)

    /*codevs 3279 二分+dfs贪心检验 堆版本 re一个 爆栈了*/ #include<cstdio> #include<queue> #include<cst ...

  5. BZOJ1774[USACO 2009 Dec Gold 2.Cow Toll Paths]——floyd

    题目描述 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费 ...

  6. BZOJ1775[USACO 2009 Dec Gold 3.Video Game Troubles]——DP

    题目描述 输入 * 第1行: 两个由空格隔开的整数: N和V * 第2到第N+1行: 第i+1行表示第i种游戏平台的价格和可以在这种游戏平台上面运行的游 戏.包含: P_i, G_i还有G_i对由空格 ...

  7. [USACO 2017 Open Gold] Tutorial

    Link: 传送门 A: 由于每个颜色只染色一次就确定了所有要染色的区间 要求染色的次数其实就是求区间最多嵌套多少层,如果有区间相交则无解 以上操作明显可以将左端点排序后用栈来维护 #include ...

  8. [USACO 2017 Feb Gold] Tutorial

    Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...

  9. [USACO 2017 Jan Gold] Tutorial

    Link: 传送门 A: 按值大小插入后用树状数组统计两边个数 #include <bits/stdc++.h> using namespace std; #define X first ...

随机推荐

  1. CSS浮动为什么不会遮盖同级元素

    1.问题描述 在W3CSchool学习web前端时,看完CSS定位-浮动这一节后,感觉没有什么问题.但是在CSS高级-分类这一节的中进行实践时,遇到了如下问题.测试地址:浮动的简单应用. 完整的htm ...

  2. 边绘边理解prototype跟__proto__

    网上流传着一张讲解prototype跟__proto__关系的图,尽管他已经描绘的很清楚了,但对于初学者来说,江太公感觉还是过于纠结,于是起心重绘,让他们之间的关系更加明晰可理解,一方面出于分享目的, ...

  3. oracle 的number数据类型

    NUMBER类型细讲:Oracle number datatype 语法:NUMBER[(precision [, scale])]简称:precision --> p      scale   ...

  4. 【目录】Python模块学习系列

    目录:Python模块学习笔记 1.Python模块学习 - Paramiko  - 主机管理 2.Python模块学习 - Fileinput - 读取文件 3.Python模块学习 - Confi ...

  5. 【Python学习】解决pandas中打印DataFrame行列显示不全的问题

    在使用pandas的DataFrame打印时,如果表太长或者太宽会自动只给前后一些行列,但有时候因为一些需要,可能想看到所有的行列. 所以只需要加一下的代码就行了. #显示所有列 pd.set_opt ...

  6. thread_info&内核栈

    转载:http://blog.chinaunix.net/uid-22548820-id-2125152.html 之所以将thread_info结构称之为小型的进程描述符,是因为在这个结构中并没有直 ...

  7. 64_c2

    coin-or-Bcp-1.4.3-3.fc26.i686.rpm 22-May-2017 21:07 250866 coin-or-Bcp-1.4.3-3.fc26.x86_64.rpm 22-Ma ...

  8. 在LINUX平台上手动创建多个实例(oracle11g)

    在LINUX平台上手动创建多个实例(oracle11g) http://blog.csdn.net/sunchenglu7/article/details/39676659 ORACLE linux ...

  9. Java GC策略

    本文转自https://blog.csdn.net/rabbit_in_android/article/details/50386954 内存管理和垃圾回收 JVM内存组成结构 JVM栈由堆.栈.本地 ...

  10. BZOJ 3771 生成函数,FFT

    Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: “这把斧头,是不是你的?” 樵夫一看:“是啊是啊!” 水神把斧头扔在一 ...