我们先把简单的不能搞死,具题意可证:每个蓄水长的管辖区域一定是连续的。
证明:既然我们已经能了那么我们就可以说如果这个区间不是连续的那我们取出这个区间中间阻隔开的那一段,那么对于这一整个区间来说水源不可能来自两边那么一定至少有一条直通蓄水厂的路连其上一点,那么对于连着的那个蓄水厂a,以及我们造成此区间的蓄水厂b,b一定不是a,b若在a的左边则无法到达右边,若b在a的右边则无法到达左边,因此移动是连续的。由于数据中有一个一行的(既邻水又临漠),我要说一下,对于这个结论显然成立。
那么我们既然知道了每个蓄水厂的管辖范围我们进行右端点贪心即可。

#include<cstdio>
#include<bitset>
#include<algorithm>
#include<vector>
#define N 505
using namespace std;
inline int read()
{
int sum=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
struct Tr
{
int to,next;
}c[N*N*];
int head[N*N],t,kin[N*N];
bool v[N*N];
bitset<N> ctr[N];
int n,m;
int h[N][N];
inline int get(int x,int y)
{
return (x-)*m+y;
}
inline void add(int x,int y)
{
c[++t].to=y;
c[t].next=head[x];
head[x]=t;
}
void Init()
{
n=read(),m=read();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
h[i][j]=read();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(h[i+][j]<h[i][j]&&i+<=n)add(get(i,j),get(i+,j));
if(h[i-][j]<h[i][j]&&i->)add(get(i,j),get(i-,j));
if(h[i][j+]<h[i][j]&&j+<=m)add(get(i,j),get(i,j+));
if(h[i][j-]<h[i][j]&&j->)add(get(i,j),get(i,j-));
}
for(int i=;i<=m;i++)
kin[get(,i)]=,kin[get(n,i)]=;
}
int hol=;
void jud(int x)
{
if(v[x])return;
if(kin[x]==)hol++;
v[x]=;
for(int i=head[x];i;i=c[i].next)
jud(c[i].to);
}
bool Jud()
{
for(int i=;i<=m;i++)
jud(i);
if(hol<m)
{
printf("");
printf("\n");
printf("%d\n",m-hol);
return ;
}
return ;
}
bool over[N];
int vo[N*N];
void dfs(int x,int now)
{
if(vo[x]==now)return;
vo[x]=now;
if(kin[x]==&&x!=now)
over[x]=;
if(kin[x]==)
ctr[now][x-(n-)*m]=;
for(int i=head[x];i;i=c[i].next)
dfs(c[i].to,now);
}
struct DP
{
int l,r;
}dp[N];
int Min,ans,NN=;
int bre[N];
bool Now[N];
int comp(const DP a,const DP b)
{
return a.l<b.l;
}
void Dp()
{
NN--;
sort(dp+,dp+NN+,comp);
int now=,Ans=;
for(int i=;i<=NN;i++)
{
if(dp[i].l>now)
{
ans++;
now=Ans+;
if(now>m)break;
}
if(dp[i].r>Ans)
Ans=dp[i].r;
}
if(now<=m)
ans++;
}
void work()
{
for(int i=;i<=m;i++)
if(!over[i])
dfs(i,i);
for(int i=;i<=m;i++)
if(!over[i])
bre[++Min]=i;
for(int i=;i<=Min;i++)
{
int no=;
for(int j=;j<=m;j++)
{
if(no==&&ctr[bre[i]][j]==)
{
no=;
dp[NN].l=j;
}
if(no==&&ctr[bre[i]][j]==)
{
dp[NN].r=j-;
break;
}
}
if(no==)
{
i--;
Min--;
continue;
}
if(dp[i].r==)
dp[NN].r=m;
NN++;
}
Dp();
printf("");
printf("\n");
printf("%d\n",ans);
}
int main()
{
Init();
if(Jud())return ;
work();
return ;
}

NOIP2010 引水入城 贪心+DFS的更多相关文章

  1. NOIP2010引水入城[BFS DFS 贪心]

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  2. [NOIP2010] 引水入城 贪心 + 记忆化搜索

    ---题面--- 题解: 本蒟蒻并没有想到bfs的做法,,,, 只会dfs了 首先我们需要知道一个性质. 我们设k[i].l 为在i点建立水库可以支援到的最左边的城市,k[i].r为最右边的. 那么点 ...

  3. 521. [NOIP2010] 引水入城 cogs

    521. [NOIP2010] 引水入城 ★★★   输入文件:flow.in   输出文件:flow.out   简单对比时间限制:1 s   内存限制:128 MB 在一个遥远的国度,一侧是风景秀 ...

  4. NOIP2010 引水入城

    4引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个 ...

  5. noip2010 引水入城 bfs+贪心

    如果能够实现,每个河边的城市对应的控制区域一定是一条线段. 所以直接bfs每个河边的城市,贪心线段的右端点 #include<cstdio> #include<cstring> ...

  6. Luogu1514 NOIP2010 引水入城 BFS、贪心

    传送门 NOIP的题目都难以写精简题意 考虑最上面一排的某一个点对最下面一排的影响是什么样的,不难发现必须要是一段连续区间才能够符合题意. 如果不是一段连续区间,意味着中间某一段没有被覆盖的部分比周围 ...

  7. NOIP2010 引水入城 题解

    http://www.rqnoj.cn/problem/601 今天发现最小区间覆盖竟然是贪心,不用DP!于是我又找到这题出来撸了一发. 要找到最上面每个城市分别能覆盖最下面哪些城市,如果最下面有城市 ...

  8. noip2010引水入城

    https://www.zybuluo.com/ysner/note/1334997 这道题fst了 题面 戳我 解析 我一开始的想法是,按照高度给第一行排序,然后贪心地选取目前到不了的,高度最高的第 ...

  9. noip 2010 引水入城 贪心 + 搜索

    不难分析出如果有解则每个蓄水厂所能覆盖到的干旱城市一定是连续的.否则,中间那些没被覆盖的部分永远都不能被覆盖到. 当然,每个蓄水厂所覆盖的城市有可能不连续,不过既然有解,则一定都是连续的.我们可以开一 ...

随机推荐

  1. ffplay使用笔记

    ffplay播放yuv文件命令: ffplay -f rawvideo -video_size 1920x1080 a.yuv   ffplay播放mp4.h.264.hevc文件命令: ffplay ...

  2. R语言绘图:在地图上绘制散点图

    使用ggplot2在地图上绘制散点图 ######*****绘制散点图代码*****####### options(baidumap.key = '**************') #设置密钥 bei ...

  3. 「LibreOJ#516」DP 一般看规律

    首先对于序列上一点,它对答案的贡献只有与它的前驱和后驱(前提颜色相同)构成的点对, 于是想到用set维护每个颜色,修改操作就是将2个set暴力合并(小的向大的合并),每次插入时更新答案即可 颜色数要离 ...

  4. 【財務会計】BS科目とは・PL科目とは

    「BS科目」「PL科目」という言葉がありますが.聞いたことあるけどよくわからん!っていう人は多いと思います.なので.簡単にご説明を. BS科目は「いくらあるか」 「BS科目」は.「B/S科目」と書くこ ...

  5. [Hbase]hbase命令行基本操作

    -进入hbase shell hbase shell - 帮助help help - 查看hbase versionversion - 查看hbase 状态 status - 创建表create 't ...

  6. 深度学习:激活函数的比较和优缺点,sigmoid,tanh,relu

    https://blog.csdn.net/u011684265/article/details/78039280

  7. c++ class as sort function

    // constructing sets #include <iostream> #include <set> #include <string.h> bool f ...

  8. Mysql性能优化一:SQL语句性能优化

    这里总结了52条对sql的查询优化,下面详细来看看,希望能帮助到你 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2,应尽量避免在 w ...

  9. 九度OJ--1164(C++)

    #include <iostream>#include <vector> using namespace std; int main() { int n; // n为矩阵阶数 ...

  10. c#程序中的AssemblyInfo.cs

    在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍 //是否符合公共 ...