您的位置:首页 > 其它

CERC 2009 Cav 扫描法 (uvaLive 4621 - Cav)

2016-04-03 22:20 274 查看
/*
问题等价于对每一格(横坐标跨度为1)求出可行的最大水位,然后累加每一位置。
*/

#include<bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define rep(i,n) for(int i=0 ;i<(n) ;i++)
using namespace std;
typedef long long ll;
const int INF =0x3f3f3f3f;
const int maxn=1e6 ;
int n,d[maxn+10],u[maxn+10],h[maxn+10];
void read()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&d[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&u[i]);
}
}
void work()
{
//首先从左往右扫,处理好每个格子与左边的关系。
int level=u[1];//一开始让水位尽可能大
for(int i=1;i<=n;i++)
{
if(level<d[i]) level=d[i];//如果...那么这时此处必须没水,否则淹没左边区域。
else if(level>u[i]) level=u[i];//此处被左边淹没,要求下降水位。
h[i]=level;//这个是考虑格子i左边 得出的格子i可行的最大水位。

}
level=u
;
int ans=0;
for(int i=n;i>=1;i--)
{
if(level<d[i]) level=d[i];
else if(level>u[i]) level=u[i];
ans+=min(level,h[i])-d[i];
}
printf("%d\n",ans);
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
read();
work();

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: