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:題目改了,和比賽的時候不一樣了,數(shù)據(jù)范圍很小,dfs
E:RMQ + binary_search
給出n個數(shù)和一個范圍K。
找出最長的連續(xù)的數(shù),其中最大值和最小值的差不超過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會超時。
求區(qū)間最大值最小值可以用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,需要調整。