解析

本题做的过程大概是:到了正解门口决定回头,绕了地球一圈最后从另一边走到正解了…

我的分析:
首先 easy version 很简单,如果从一列最大值可以走到另一列最大值,那么后者就没用了。缩完点所有的零度点就是答案。

hard version 的问题就是选的点是最大值,但要求走到的点不一定是最大值。
要求走到的点如果互相可达,那么可以被到达的也没用了,所以有用的点满足互不可达。
如果到一个要求点的时候够不到要求高度了,后面的要求点必然更达不到,所以选择每一列后可以满足的点必然是连续的区间。
而且不难发现我选的列右移的时候,其满足的点的区间两端点必然都单调不降。

现在的问题就是如何求出这些区间,剩下的就是一个贪心问题了。
然后我的大脑就当机了,觉得这玩意不可求,于是就尝试贪心拓展区间再利用缩点判定合法,很费劲的也搞出来了。
但这样求可达区间的问题其实就和炸弹那个题一样,维护可达的 l,rl,rl,r 取取 max⁡,min⁡\max,\minmax,min 就行了。

代码

当然,再敲一遍正解是不可能的

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
using namespace std;const int N=4e5+100;
const int inf=1e9;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;
bool flag=0;
vector<int>mp[N],pt[N];
int a[N],h[N],mx[N];
vector<int>e[N];
int tot;
int dfn[N],low[N],zhan[N],col[N],tim,top;
void tarjan(int x){dfn[x]=low[x]=++tim;zhan[++top]=x;for(int to:e[x]){if(!dfn[to]){tarjan(to);low[x]=min(low[x],low[to]);}else if(!col[to]) low[x]=min(low[x],dfn[to]);}if(low[x]==dfn[x]){col[x]=++tot;while(zhan[top]!=x) col[zhan[top--]]=tot;top--;}return;
}int cnt;
signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifn=read();m=read();for(int i=0;i<=n+1;i++){mp[i].resize(m+2);pt[i].resize(m+2);}char c;for(int i=n;i>=1;i--){for(int j=1;j<=m;j++){scanf(" %c",&c);mp[i][j]=(c=='#');}    }for(int j=1;j<=m;j++) a[j]=read(),cnt+=a[j];if(!cnt){printf("0");return 0;}for(int j=1;j<=m;j++){for(int i=1;i<=n;i++){if(mp[i][j]) pt[i][j]=++tot;}}for(int j=1;j<=m;j++){int lst=0;for(int i=1;i<=n;i++){if(!mp[i][j]) continue;if(mp[i+1][j]) e[pt[i][j]].push_back(pt[i+1][j]);for(int k=i;k>lst;k--){if(mp[k][j-1]) e[pt[i][j]].push_back(pt[k][j-1]);if(mp[k][j+1]) e[pt[i][j]].push_back(pt[k][j+1]);}if(lst) e[pt[i][j]].push_back(pt[lst][j]);lst=i;}mx[j]=lst;}int s=tot;for(int i=1;i<=s;i++){if(!dfn[i]) tarjan(i);}for(int j=1;j<=m;j++){int lft=a[j];for(int i=0;i<=n;i++){lft-=mp[i][j];if(lft==0){h[j]=i;break;}}for(int i=0;i<=n;i++){if(col[pt[i][j]]==col[pt[h[j]][j]]){h[j]=i;break;}}}int ans(0),pl=1;while(pl<=m){int j,ned=h[pl],pos=0;for(j=pl+1;j<=m;j++){      if(ned){pos=0;for(int i=1;i<=n;i++){if(mp[i][j]){if(i>=ned||col[pt[i][j]]==col[pt[ned][j-1]]){pos=i;break;}}}  if(!pos) break;ned=pos;}ned=max(ned,h[j]);}j--;while(j&&!mx[j]) j--;int o=col[pt[mx[j]][j]];while(j<m&&col[pt[h[j+1]][j+1]]<=o) j++;pl=j+1;ans++;}printf("%d\n",ans);return 0;
}
/*
*/

CF1534F:Falling Sand(tarjan、贪心、dp)相关推荐

  1. URAL 1203 Scientific Conference(贪心 || DP)

    Scientific Conference 之前一直在刷计算几何,邀请赛连计算几何的毛都买见着,暑假这一段时间就做多校,补多校的题目,刷一下一直薄弱的DP.多校如果有计算几何一定要干掉-.- 题意:给 ...

  2. Codeforces Round #699 (Div. 2) E.Sorting Books(贪心+DP / 线段树)超高质量题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 E - Sorting Books 一排书架上有 nnn 本书排成一排,每本书上有一个颜色 aia_i ...

  3. 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp

    题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...

  4. HDU 4001 To Miss Our Children Time(2011年大连网络赛 A 贪心+dp)

    开始还觉得是贪心呢...  给你三类积木叫你叠楼房,给你的每个积木包括四个值:长 宽(可以互换) 高 类型d  d=0:你只能把它放在地上或者放在 长 宽 小于等于 自己的积木上面  d=1:你只能把 ...

  5. 【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]

    巴厘岛的雕塑 Time Limit: 10 Sec  Memory Limit: 64 MB [Submit][Status][Discuss] Description 印尼巴厘岛的公路上有许多的雕塑 ...

  6. 杭电oj1257最少拦截系统—贪心/dp最大递增子序列

    附上题目链接:杭电oj1257 这个题目有动态规划和贪心两种解决方式. 贪心法1: 对于导弹我们知道只可以从大到小的反导,一个系统必须从大到小排列.那么我们就可以选择从最高的那个导弹入手,往右找仅次于 ...

  7. CF1155D Beautiful Array 贪心,dp

    CF115DBeautiful Array 题目大意:给一个有n个元素的a数组,可以选择其中一个区间的所有数都乘上x,也可以不选,求最大子序列和. 如果没有前面的操作,就是只求最大子序列和,我们都知道 ...

  8. CodeForces - 1481E Sorting Books(贪心+dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,每次操作可以将任意一本书放到序列的末尾,问最少需要操作多少次,才能使得相同的数字挨在一起 题目分析:不难看出,对每个位置的数都操作一次,是 ...

  9. 2020ICPC(小米邀请赛2) - Knapsack(贪心+dp)

    题目链接:点击查看 题目大意:给出 n 个物品,每个物品都有体积和价值,现在问容量为 m 的背包最多可以装下多少价值的物品 题目分析:本题正解应该是斜率优化dp,然鹅看了大佬们的博客讲解后,感觉不是自 ...

最新文章

  1. 网站推广——站长助力创业期企业网站优化推广的好选择
  2. 收敛标准对卷积核数量最优值的影响
  3. Nuget包制作最佳解决方案
  4. Java黑皮书课后题第7章:*7.22(计算一个字符串中大写字母的数目)编写程序,从命令行输入一个字符串,然后显示字符串中大写字母的数目
  5. 使用drawio进行画图真的很方便(WEB版/Chrome APP版/桌面版)
  6. SRS流媒体服务器搭建+ffmpeg推流VLC取流观看
  7. 51. N 皇后018(回溯法求解)
  8. CF536C-Tavas and Pashmaks【凸壳】
  9. 爬虫学习一:HTTP、网页基础、requests、API、JS
  10. 计算机多媒体的应用 毕业论文,计算机多媒体技术(毕业论文)多媒体技术与应用.doc...
  11. Sharding-JDBC(操作公共表)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记013
  12. struts 标签导入
  13. GitHub提交代码后不显示用户名只显示邮箱
  14. LintCode 寻找旋转排序数组中的最小值 II
  15. 两段检验系统生成的identityHashCode是否重复的代码
  16. 5.8Ghz微波雷达感应技术,智能雷达传感器,人体感应技术方案
  17. STM32F107的时钟设置
  18. 浅谈App Hybrid混合开发的五种方案
  19. 2022芒果TV算法赛_用户下一个观看视频预测_baseline_CF召回YoutubeDNN
  20. The Fewest Coins POJ - 3260

热门文章

  1. 大数据可视化设计到底是啥,该怎么用
  2. 高速的二舍八入三七作五_有没有发现,高速收费都是5的倍数,这是为什么?怎么判断的?...
  3. uboot移植9个步骤_不知道具体的新房装修步骤?9个步骤教你吃透装修
  4. linux配置ip地址 routes,CentOS 7 设置网络IP地址(示例代码)
  5. contos6.5卸载php7,centos8 测地卸载php5.6 与卸载php7
  6. 今日笔记!——分析Java应用性能
  7. c语言分配多一个字符空间,关于C语言动态给字符串分配内存空间问题
  8. linux 修复图形界面,图形界面操作的备份和恢复Linux发行版
  9. Linux怎么更新镜像,利用 Zsync 更新已有的 Ubuntu ISO 镜像
  10. matlab编程数字信号,MATLAB--数字信号实验.doc