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

来源:互联网 发布:万学海文考研 知乎 编辑:程序博客网 时间:2024/06/07 22:11




/*问题等价于对每一格(横坐标跨度为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[n];    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;}


0 0