AtCoder Regular Contest 093

比赛链接  

T1

自己刚开始傻哔哔的交了一个O(n log n)的算法上去,没有看到范围是10^5。用类似滑动窗口的做法可以把算法优化到O(n)

#include<cstdio>
#define van 100010
inline int abs(int a){return a<0? -a:a;}
int ans[van],d[van],a,n,i;
main(){
    scanf("%d",&n);
    d[0]=d[n+1]=0;
    for(i=1;i<=n;++i) scanf("%d",&d[i]),a+=abs(d[i-1]-d[i]);
    ans[1]=a=a+abs(d[n])-abs(d[1])+abs(d[2])-abs(d[1]-d[2]);
    int cache=0;
    for(i=2;i<=n;++i)
        ans[i]=a=a+abs(d[i-2]-d[i-1])+abs(d[i+1]-d[i-1])-abs(d[i-2]-d[i])-abs(d[i+1]-d[i]);
    for(i=1;i<=n;++i) printf("%d\n",ans[i]);
}

T2

一道构造题。想法精妙就能ac。首先建造一个100x100的地图,然后上50行为'.',下50行为'#'。就像这样

........
........
........
........
########
########
########
########

当然a和b是不可能为1的。我们先将a和b减去1,然后再进行操作。当a=3,b=6时,就像下图。

#.#.#.#.
........
#.......
........
########
.#.#####
########
########

然后把这样8x8的情况推广到100x100就可以了。

#include<cstdio>
int a,b,i,j;
char paper[101][101];
main(){
    puts("100 100");
    scanf("%d%d",&a,&b);
    for(i=0;i<50;++i) 
        for(j=0;j<100;++j) paper[i][j]='.';
    for(i=50;i<100;++i)
        for(j=0;j<100;++j) paper[i][j]='#';
    --a,--b;
    for(i=0;i<50;++i) if(i%2==0)
        for(j=0;j<100;++j){
            if(b==0) break;
            if(j%2==0) paper[i][j]='#',--b;
        }
    for(i=52;i<100;++i) if(i%2==0)
        for(j=0;j<100;++j){
            if(a==0) break;
            if(j%2==0) paper[i][j]='.',--a;
        }
    for(i=0;i<100;++i) puts(paper[i]);
}

猜你喜欢

转载自www.cnblogs.com/jiaangk/p/9203769.html