NOIP2010 引水入城 贪心+DFS
我们先把简单的不能搞死,具题意可证:每个蓄水长的管辖区域一定是连续的。
证明:既然我们已经能了那么我们就可以说如果这个区间不是连续的那我们取出这个区间中间阻隔开的那一段,那么对于这一整个区间来说水源不可能来自两边那么一定至少有一条直通蓄水厂的路连其上一点,那么对于连着的那个蓄水厂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的更多相关文章
- NOIP2010引水入城[BFS DFS 贪心]
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...
- [NOIP2010] 引水入城 贪心 + 记忆化搜索
---题面--- 题解: 本蒟蒻并没有想到bfs的做法,,,, 只会dfs了 首先我们需要知道一个性质. 我们设k[i].l 为在i点建立水库可以支援到的最左边的城市,k[i].r为最右边的. 那么点 ...
- 521. [NOIP2010] 引水入城 cogs
521. [NOIP2010] 引水入城 ★★★ 输入文件:flow.in 输出文件:flow.out 简单对比时间限制:1 s 内存限制:128 MB 在一个遥远的国度,一侧是风景秀 ...
- NOIP2010 引水入城
4引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个 ...
- noip2010 引水入城 bfs+贪心
如果能够实现,每个河边的城市对应的控制区域一定是一条线段. 所以直接bfs每个河边的城市,贪心线段的右端点 #include<cstdio> #include<cstring> ...
- Luogu1514 NOIP2010 引水入城 BFS、贪心
传送门 NOIP的题目都难以写精简题意 考虑最上面一排的某一个点对最下面一排的影响是什么样的,不难发现必须要是一段连续区间才能够符合题意. 如果不是一段连续区间,意味着中间某一段没有被覆盖的部分比周围 ...
- NOIP2010 引水入城 题解
http://www.rqnoj.cn/problem/601 今天发现最小区间覆盖竟然是贪心,不用DP!于是我又找到这题出来撸了一发. 要找到最上面每个城市分别能覆盖最下面哪些城市,如果最下面有城市 ...
- noip2010引水入城
https://www.zybuluo.com/ysner/note/1334997 这道题fst了 题面 戳我 解析 我一开始的想法是,按照高度给第一行排序,然后贪心地选取目前到不了的,高度最高的第 ...
- noip 2010 引水入城 贪心 + 搜索
不难分析出如果有解则每个蓄水厂所能覆盖到的干旱城市一定是连续的.否则,中间那些没被覆盖的部分永远都不能被覆盖到. 当然,每个蓄水厂所覆盖的城市有可能不连续,不过既然有解,则一定都是连续的.我们可以开一 ...
随机推荐
- python并发编程之多进程、多线程、异步、协程、通信队列Queue和池Pool的实现和应用
什么是多任务? 简单地说,就是操作系统可以同时运行多个任务.实现多任务有多种方式,线程.进程.协程. 并行和并发的区别? 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任 ...
- Excel学习路径总结
本片涉及从入门到Excel的各个方向,包含众多资料和自己学习的心得,希望您可以仔细阅之: 入门篇: 无论是软件,还是编程,最好的入门就是通过看视频来学习,视频优点为很容易看清楚,手把手教授,不容易 ...
- Kubernetes-tutorials(五)
The tutorials use Katacoda to run a virtual terminal in your web browser that runs Minikube, a small ...
- poj 2393 奶牛场生产成本问题 贪心算法
题意:有一个奶牛场,第i周的生产成本为c,需要数量为 y,每周的存储成本为s.问怎么安排使得成本最低? 思路: 成本最低是吧?求出每周的最低成本*该周需要的数量就是成本最低 每周的成本有两个:自己本周 ...
- python2.7入门--- 日期和时间
Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能.我们今天就来看一下这方面,首先得知道,Python 提供了一个 time 和 calendar 模块可以用于格式化日 ...
- P1331 海战
P1331 海战 题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防 ...
- ES6 export,import报错
问题描述: 现有两个文件: profile.js const firstName = 'Michael'; const lastName = 'Jackson'; const year = 2018; ...
- bam文件测序深度统计-bamdst
最近接触的数据都是靶向测序,或者全外测序的数据.对数据的覆盖深度及靶向捕获效率的评估成为了数据质量监控中必不可少的一环. 以前都是用samtools depth 算出单碱基的深度后,用perl来进行深 ...
- jmeter接口测试--响应结果Unicode转码成中文
jmeter接口测试-响应结果Unicode转码成中文 一般情况下,接口返回数据都会经过加密,所以有时相应结果会显示为Unicode,因此,需添加BeanShell PostProcessor,加入代 ...
- 【转】用ASP.NET Core 2.1 建立规范的 REST API -- 缓存和并发
原文链接:https://www.cnblogs.com/cgzl/p/9165388.html 本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/901 ...