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,需要调整。