比赛链接
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]);
}