[CCO 2019] Sirtet

  • description
  • solution
  • code

description

题目链接

solution

很巧妙地将差分约束隐藏起来

问题的关键在于求出每一个sand停止运动的时间,这样很容易填涂出最后的答案(向下平移即可)

不妨设 ti,jt_{i,j}ti,j​ 表示 (i,j)(i,j)(i,j) 位置上的 sand\text{sand}sand 停止运动的时间

  • 如果 (i1,j1)(i_1,j_1)(i1​,j1​) 和 (i2,j2)(i_2,j_2)(i2​,j2​) 的 sand\text{sand}sand 是连在一起的,则 ti1,j1=ti2,j2t_{i_1,j_1}=t_{i_2,j_2}ti1​,j1​​=ti2​,j2​​

    转化成差分约束的形式,即 ti1,j1−ti2,j2≤0,ti2,j2−ti1,j1≤0t_{i_1,j_1}-t_{i_2,j_2}\le 0,t_{i_2,j_2}-t_{i_1,j_1}\le 0ti1​,j1​​−ti2​,j2​​≤0,ti2​,j2​​−ti1​,j1​​≤0

    显然,这是具有传递性的【在代码实现中,我选择了同一连通块缩点的方法,利用并查集】

  • 如果 (i1,j1)(i_1,j_1)(i1​,j1​) 和 (i2,j2)(i_2,j_2)(i2​,j2​) 的 sand\text{sand}sand 不是连在一起的,显然只有 j1=j2j_1=j_2j1​=j2​ 【同一列】的 sand\text{sand}sand 会相互影响

    假设 i1<i2i_1<i_2i1​<i2​ ,显然最多经过 i2−i1−1i_2-i_1-1i2​−i1​−1 的时间后就一定会碰上【可能i1i_1i1​所属的连通块的某个 sand\text{sand}sand 会与其余连通块先撞上】,即 ti1,j1−ti2,j2≤i2−i1−1t_{i_1,j_1}-t_{i_2,j_2}\le i_2-i_1-1ti1​,j1​​−ti2​,j2​​≤i2​−i1​−1

    注意:同一列只需要相邻的两个不同连通块的 sand\text{sand}sand 进行连边【具有传递性】,且最下面的 sand\text{sand}sand 与空【定义为000】的距离为 n−in-in−i

最后求不同连通块之间的最短路即可

code

#include <queue>
#include <cstdio>
#include <vector>
using namespace std;
#define maxn 1000005
#define Pair pair < int, int >
priority_queue < Pair, vector < Pair >, greater < Pair > > q;
vector < Pair > G[maxn];
int n, m;
char **ch, **ans;
int *lst;
int dis[maxn], f[maxn];
bool vis[maxn];int find( int x ) { return f[x] == x ? x : f[x] = find( f[x] ); }void merge( int u, int v ) {u = find( u ), v = find( v );if( u == v ) return;else f[v] = u;
}void addedge( int u, int v, int w ) { u = find( u ), v = find( v );G[u].push_back( { v, w } );
}int id( int x, int y ) { return ( x - 1 ) * m + y; }int main() {scanf( "%d %d", &n, &m );ch = new char * [n + 5];lst = new int [m + 5];for( int i = 1;i <= n;i ++ ) {ch[i] = new char[m + 5];scanf( "%s", ch[i] + 1 );}for( int i = 1;i <= n * m;i ++ ) f[i] = i;for( int i = 1;i <= n;i ++ ) {for( int j = 1;j <= m;j ++ ) {lst[j] = 0; if( ch[i][j] == '#' ) {if( i > 1 and ch[i - 1][j] == '#' ) merge( id( i, j ), id( i - 1, j ) );if( i < n and ch[i + 1][j] == '#' )merge( id( i, j ), id( i + 1, j ) );if( j > 1 and ch[i][j - 1] == '#' )merge( id( i, j ), id( i, j - 1 ) );if( j < m and ch[i][j + 1] == '#' )merge( id( i, j ), id( i, j + 1 ) );}}}for( int i = 1;i <= n;i ++ )for( int j = 1;j <= m;j ++ )if( ch[i][j] == '#' ) {if( lst[j] ) addedge( id( i, j ), id( lst[j], j ), i - lst[j] - 1 );lst[j] = i;}for( int i = 1;i <= m;i ++ ) if( lst[i] ) addedge( 0, id( lst[i], i ), n - lst[i] );for( int i = 1;i <= n * m;i ++ ) dis[i] = 0x3f3f3f3f;q.push( { 0, 0 } );while( ! q.empty() ) {int u = q.top().second; q.pop();if( vis[u] ) continue;vis[u] = 1;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i].first, w = G[u][i].second;if( dis[v] > dis[u] + w ) {dis[v] = dis[u] + w;q.push( { dis[v], v } );}}}ans = new char * [n + 5];for( int i = 1;i <= n;i ++ ) {ans[i] = new char [m + 5];for( int j = 1;j <= m;j ++ ) ans[i][j] = '.';}for( int i = 1;i <= n;i ++ )for( int j = 1;j <= m;j ++ )if( ch[i][j] == '#' ) ans[i + dis[find( id( i, j ) )]][j] = '#';for( int i = 1;i <= n;i ++ ) {for( int j = 1;j <= m;j ++ )printf( "%c", ans[i][j] );printf( "\n" );}return 0;
}

[CCO 2019] Sirtet(差分约束+最短路)相关推荐

  1. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  2. AcWing 4247. 糖果(差分约束最短路)

    题目连接 https://www.acwing.com/problem/content/4250/ http://poj.org/problem?id=3159 思路 假设第i个同学得到的糖果数量为a ...

  3. I - 动物狂想曲 (HDU-6252)(差分约束-最短路模型+判负环)

    雷格西桑和路易桑是好朋友,在同一家公司工作.他们总是一起乘地铁去上班.他们的路线上有N个地铁站,编号从1到N.1站是他们的家,N站是公司. 有一天,雷格西桑起床晚了.当他来到车站时,路易桑已经离开X分 ...

  4. POJ - 1201 Intervals(差分约束+最短路)

    题目链接:点击查看 题目大意:给定n个闭区间[ai,bi]和n个整数ci,你需要构造一个整数集合Z,使得Z中满足所有的ai<=x<=bi的整数不少于ci个,求出这样的整数集合Z最少包含多少 ...

  5. 算法提高课-图论-差分约束- AcWing 1169. 糖果:spfa求单源最短路、差分约束

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 差分约束系统 差分约束系统是一种特殊的N元一次不等式组.它包含N个变量X1,...,XnX_1,...,X_nX1​,...,Xn​ ...

  6. POJ3169 Layout , 最短路算法解差分约束问题

    POJ3169 Layout 题意: n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0.这些牛的距离存在着一些约束关系:1.有ml组(u, v, w)的约束关系,表示牛 ...

  7. SUST 2019暑期集训题解(差分约束+生成树+传递闭包)

    A 这个不等式组很眼熟吧 这道题的话上课讲过就是根据不等式建图然后跑一下最短路就可以了. #include<iostream> #include<cstring> #inclu ...

  8. QBXT 2018春季DP图论班 2018.4.29 --- 最短路差分约束

    *钟皓曦老师授课* 常见最短路算法: Floyd → O(n^3) //floydint dist[maxn][maxn];memset(dist,0x3f,sizeof(dist)); for (i ...

  9. HDU3440(差分约束+SPFA算法)

    题意:两栋房子之间的最大距离为D,也就是A-B<=D,现在求出最矮和最高房子之间的最大距离 思路:差分约束+SPFA算法: 当问题可以转化为形如一组 xi‑x'i<=yi 或一组 xi‑x ...

最新文章

  1. 2021-2027全球与中国奶牛冻精市场现状及未来发展趋势
  2. ML之Xgboost:利用Xgboost模型对数据集(比马印第安人糖尿病)进行二分类预测(5年内是否患糖尿病)
  3. SpringBoot 使用Swagger2打造在线接口文档(附源代码)
  4. 划分VLAN,以及VLAN间通信
  5. html ios视频播放器,良心推荐!iOS端的视频播放应用
  6. html有序列表和无序列表互相嵌套,关于列表的嵌套,下列说法正确的是( )。 答案:无序列表和有序列表可以相互嵌套与 之间相当于一个容器,可以嵌套无序列表、有序列表等网页元素...
  7. spark sql hbase java_Spark 读写 HBase 的两种方式(RDD、DataFrame)
  8. 复杂推理模型从服务器移植到Web浏览器的理论和实战
  9. 常见Spring异常
  10. 任丽萍跟我赌200块钱的
  11. anaconda 安装在c盘_Anaconda安装和使用原来这么简单...
  12. 一步一步 IText.Sharp 之 Hello Word
  13. 项目管理指标_企业工程项目管理部门绩效考核KPI关键指标,共4个维度113项指标...
  14. eclipse解压版_Eclipse配置JavaWeb开发环境
  15. Ajax学习笔记-基础概述-1
  16. Foxmail设置方法
  17. 面试技巧顶个P --leo谈应届生求职 2
  18. spark统计pv和uv值
  19. CWnd::FromHandle与CWnd::FromHandlePermanent有什么区别
  20. SQL Server 2008 R2 企业版/开发版/标准版

热门文章

  1. Python项目可以有多大?最多可以有多少行代码?
  2. linux http 分析工具,技术|httpstat:一个检查网站性能的 curl 统计分析工具
  3. redis查看key的过期时间_面试官:你在Redis中设置过带过期时间的Key吗?
  4. bread是可数还是不可数_雅思官方语法教程之——这个名词到底可不可数?
  5. matlab 抽样判决代码,matlab抽样判决器
  6. gather torch_浅谈Pytorch中的torch.gather函数的含义
  7. linux raw设备格式化,SUSE Linux 10配置裸设备(raw devices)
  8. oracle leg函数,032-函数的嵌套与LEGB原则
  9. office连接oracle,Access(VBA)连接Oracle数据库的代码
  10. python字符串截取方法_如何使用python语言中的字符串方法截取字符串