Red Huang

Red Huang

uva 10366

Logic thinking problem, personally feel very complicated, refer to the solution AC on the Internet

It's hard to explain in words, but the code is clearer

//  
//        GGGGGGGGGGGGG        CCCCCCCCCCCCC               AAA  
//     GGG::::::::::::G     CCC::::::::::::C              A:::A  
//   GG:::::::::::::::G   CC:::::::::::::::C             A:::::A  
//  G:::::GGGGGGGG::::G  C:::::CCCCCCCC::::C            A:::::::A  
// G:::::G       GGGGGG C:::::C       CCCCCC           A:::::::::A  
//G:::::G              C:::::C                        A:::::A:::::A  
//G:::::G              C:::::C                       A:::::A A:::::A  
//G:::::G    GGGGGGGGGGC:::::C                      A:::::A   A:::::A  
//G:::::G    G::::::::GC:::::C                     A:::::A     A:::::A  
//G:::::G    GGGGG::::GC:::::C                    A:::::AAAAAAAAA:::::A  
//G:::::G        G::::GC:::::C                   A:::::::::::::::::::::A  
// G:::::G       G::::G C:::::C       CCCCCC    A:::::AAAAAAAAAAAAA:::::A  
//  G:::::GGGGGGGG::::G  C:::::CCCCCCCC::::C   A:::::A             A:::::A  
//   GG:::::::::::::::G   CC:::::::::::::::C  A:::::A               A:::::A  
//     GGG::::::GGG:::G     CCC::::::::::::C A:::::A                 A:::::A  
//        GGGGGG   GGGG        CCCCCCCCCCCCCAAAAAAA                   AAAAAAA  
#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <algorithm>  
#include <cmath>  
#include <climits>  
#include <vector>  
#include <set>  
#include <map>  
#include <queue>  
#include <cctype>  
#include <utility>  
#include <ctime>  
using namespace std;  
#ifdef DEBUG  
#define VAR(a,b) decltype(b) a=(b)  
#define debug(...) printf("DEBUG: "),printf(\_\_VA\_ARGS\_\_)  
#define gettime() end\_time=clock();printf("now running time is %.7f\\n",(float)(end\_time - start\_time)/CLOCKS\_PER\_SEC);  
#else  
#define VAR(a,b) \_\_typeof(b) a=(b)  
#define debug(...)  
#define gettime()  
#endif  
typedef unsigned int uint;  
typedef long long int Int;  
typedef unsigned long long int UInt;  
#define Set(a,s) memset(a,s,sizeof(a))  
#define Write(w) freopen(w,"w",stdout)  
#define Read(r) freopen(r,"r",stdin)  
#define Pln() printf("\\n")  
#define I\_de(x,n)for(int i=0;i<n;i++)printf("%d ",x\[i\]);Pln()  
#define De(x)printf(#x"%d\\n",x)  
#define For(i,x)for(int i=0;i<x;i++)  
#define CON(x,y) x##y  
#define Pmz(dp,nx,ny)for(int hty=0;hty<ny;hty++){for(int htx=0;htx<nx;htx++){\\  
    printf("%d ",dp\[htx\]\[hty\]);}Pln();}  
#define M 3005  
#define PII pair<int,int\>  
#define PB push\_back  
#define oo INT\_MAX  
#define Set\_oo 0x3f  
#define FOR(a,b) for(VAR(a,(b).begin());a!=(b).end();++a)  
#define eps 1e-6  
#define X first  
#define Y second  
#define gca printf("im here\\n");  
clock\_t start\_time=clock(), end\_time;  
bool xdy(double x,double y){return x>y+eps;}  
bool xddy(double x,double y){return x>y-eps;}  
bool xcy(double x,double y){return x<y-eps;}  
bool xcdy(double x,double y){return x<y+eps;}  
int min3(int x,int y,int z){  
    int tmp=min(x,y);  
    return min(tmp,z);  
}  
int max3(int x,int y,int z){  
    int tmp=max(x,y);  
    return max(tmp,z);  
}  
int n;  
int nr,nl;  
int h\[M\];  
int al\[M\],ar\[M\];  
int ans;  
int lm\[M\],rm\[M\];  
void solve(){  
    int pre=0;  
    al\[0\]=0;  
    lm\[0\]=0;  
    for(int i=1;i<=nl;i++){  
        if(h\[i\]>=h\[pre\]){  
            al\[i\]=al\[i-1\]+h\[pre\]\*((i-pre)<<1);  
            lm\[i\]=pre=i;  
        }else{  
            al\[i\]=al\[i-1\];  
            lm\[i\]=pre;  
        }  
    }  
    pre=n;  
    ar\[n\]=0;  
    rm\[n\]=n;  
    for(int i=n-1;i>=nr;i--){  
        if(h\[i\]>=h\[pre\]){  
            ar\[i\]=ar\[i+1\]+h\[pre\]\*((pre-(i))<<1);  
            rm\[i\]=pre=i;  
  
        }else{  
            ar\[i\]=ar\[i+1\];  
            rm\[i\]=pre;  
        }  
    }  
//    debug("%d %d\\n",h\[lm\[nl\]\],h\[rm\[nr\]\]);  
    if(h\[lm\[nl\]\]<h\[rm\[nr\]\]){  
//        debug("ok\\n");  
        int i=nr;  
        bool fg=false;  
        int index=-1;  
        for(;h\[lm\[nl\]\]>=h\[i\];i++){  
            if(!fg&&h\[lm\[nl\]\]==h\[i\]){  
                fg=1;  
                index=i;  
            }  
        }  
        if(fg&&al\[lm\[nl\]\]<=(i-index)\*(h\[index\]<<1)){  
            int t=(index-lm\[nl\])\*(h\[index\]<<1);  
            printf("%d\\n",al\[lm\[nl\]\]\*2+t);  
        }else{  
  
            int t=(i-lm\[nl\])\*(h\[lm\[nl\]\]<<1);  
            printf("%d\\n",t+al\[lm\[nl\]\]);  
        }  
    }else if(h\[lm\[nl\]\]>h\[rm\[nr\]\]){  
//        debug("ok2\\n");  
        int i=nl;  
        bool fg=false;  
        int index=-1;  
        for(;h\[rm\[nr\]\]>=h\[i\];i--){  
            if(!fg&&h\[rm\[nr\]\]==h\[i\]){  
                fg=1;  
                index=i;  
            }  
        }  
//        debug("%d\\n",i);  
        if(fg&&ar\[rm\[nr\]\]<=(index-i)\*(h\[index\]<<1)){  
            int t=(rm\[nr\]-index)\*(h\[index\]<<1);  
            printf("%d\\n",ar\[rm\[nr\]\]\*2+t);  
        }else{  
            int t=(rm\[nr\]-i)\*(h\[rm\[nr\]\]<<1);  
            printf("%d\\n",t+ar\[rm\[nr\]\]);  
        }  
    }else{  
        int t=min(al\[lm\[nl\]\],ar\[rm\[nr\]\]);  
//        debug("%d %d %d\\n",al\[lm\[nl\]\],ar\[rm\[nr\]\],h\[rm\[nr\]\]);  
        printf("%d\\n",2\*t+(rm\[nr\]-lm\[nl\])\*(h\[rm\[nr\]\]<<1));  
    }  
}  
int main() {  
    ios\_base::sync\_with\_stdio(0);  
    int r,l;  
    while(~scanf("%d%d",&l,&r)&&r&&l){  
        n=(r-l)>>1;  
        for(int i=0,j=l;i<=n;i++,j+=2){  
            scanf("%d",&h\[i\]);  
            if(j==-1)nl=i;  
            if(j==1)nr=i;  
        }  
        solve();  
//        Set(ar,0);  
//        Set(al,0);  
    }  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
}  

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.