用户工具

站点工具


2020-2021:teams:too_low:0725-0731

2020/07/25 – 2020/07/31 周报


团队训练


李英龙

专题

比赛

题目


陈源

专题

比赛

题目


胡琎

专题

比赛

题目


本周推荐

李英龙

陈源

胡琎

CF 659 B2 Koa and the Beach (Hard Version) https://codeforces.com/contest/1384/problem/B2

题意 需要从海滩游到海岛上,给定初始时波浪高度等于0时的水深分布,波浪高度在0-k-0-k之间连续变动,已知最深能够游的水深D,求是否可以游到小岛

题解 设波浪高度为k-0-k,维护到达位置i时,可能的波浪时间范围[l, r]。位置i+1时,波浪的范围为[l+1, r+1]和 [k - (D - d[i]), k + (D - d[i])]的交,如果长度为0则不可游到。特别的,如果D大于d[i]+k则时间范围为[0,2k-1],即整个长度

特别要注意D - d[i]小于0的情况。这里pretest没有测结果B2 System test的时候WA了

Tag dp

Comment 这道题需要基于位置思考,而不是基于时间思考,因为波浪的变化是周期性有规律的,便于处理,而水深的变化是任意的。

点击以显示 ⇲

点击以隐藏 ⇱

#include <bits/stdc++.h>
 
using namespace std;
 
 
int d[300005];
int main(){
    int t = 0;
    cin>>t;
    while(t--){
        int n, k, l;
        cin>>n>>k>>l;
 
        for (int i = 1; i <= n; ++i) {
            cin>>d[i];
        }
 
        int t1 = 0, t2 = 2*k-1;
        bool ok = true;
        for (int i = 1; i <= n; ++i) {
            if(l - d[i] >= k){
                t1 = 0, t2 = 2*k-1;
            }
 
            else{
 
                if(l < d[i]){
                    ok = false;break;
                }
                int tt1 = k - (l - d[i]);
                int tt2 = k + (l - d[i]);
 
                t1++, t2++;
 
                if(tt2 < t1 || tt1 > t2)  {
                    ok = false;
                    break;
                }
                t1 = max(tt1, t1);
                t2 = min(tt2, t2);
            }
        }
 
        cout<<(ok ? "Yes" : "No")<<endl;
    }
}
2020-2021/teams/too_low/0725-0731.txt · 最后更改: 2020/08/02 11:27 由 dragonylee