2010年03月28日星期日.codeforces beta6

2010年03月28日星期日.codeforces beta6

2010年03月28日星期日.codeforces beta6

A:三角形两边之和大于第三边
B:暴力搜一下
C:模拟
 1 
 2  scanf( " %d\n " , & n);
 3  for  (i  =   0 ;i  <  n;i ++ ) {
 4    scanf( " %d " ,a  +  i);
 5  }
 6  int  L  =   0 ,R  =  n  -   1 ,time1  =   0 ,time2  =   0 ,ans1  =   0 ,ans2  =   0 ;
 7  while  (L  <=  R) {
 8     if  (time1  <  time2) {
 9        time1  +=  a[L ++ ] ,ans1  ++ ;
10    } else   if  (time1  >  time2) {
11        time2  +=  a[R -- ] ,ans2  ++ ;
12    } else  {
13        time1  +=  a[L ++ ] ,ans1  ++ ;
14    }
15  }
16  printf( " %d %d\n " ,ans1,ans2);

D:题目改了,和比赛的时候不一样了,数据范围很小,dfs
E:RMQ + binary_search
给出n个数和一个范围K。
找出最长的连续的数,其中最大值和最小值的差不超过K
一个直觉的想法是
for(i = 0;i < n;i++) {
    int L = a[i],R = a[i];
    for (j = i + 1;j < n && R - L <= K;j++) {
        更新L,R
    }
    更新answer
}

但是n是10^5,n^2会超时。
求区间最大值最小值可以用rmq,O(nlogn)预处理,O(1)的得到。
一定存在一个j,使得a [i ... j]合法,a[j + 1 ..n]不合法。
好的方法是二分搜索到这个j,水点的方法可以从后往前找j。

RMQ 可以线段树,也可以SparseTable
总复杂度O(nlogn)
codeforces 可以看代码,想看的会去找吧。这里的二分搜有trick,求的是upper_bound不是一般写的lower_bound,需要调整。

你可能感兴趣的:(2010年03月28日星期日.codeforces beta6)