第27场蓝桥月赛-补题

66 阅读1分钟

T2

蓝桥的 ojfor 循环加上 cerr 的调试信息居然给 WA 了,加到外边又不 WA,难评。

T3

过两天一看,一眼就会了

T4

看反输入了,WA 了几次才发现。

用 Binary Indexed Trees 离散化过的。

void solve(){ 
    cin >> n;
    for(int i = 1; i <= n; i ++){
        cin >> b[i];
        t[i] = b[i];
    }
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
        t[n + i] = a[i];
    }   
    sort(t + 1, t + 2 * n + 1);
    sz = unique(t + 1, t + 2 * n + 1) - t - 1;
    for(int i = 1; i <= n; i ++){
        a[i] = lower_bound(t + 1, t + sz + 1, a[i]) - t;
    }
    for(int i = 1; i <= n; i ++){
        b[i] = lower_bound(t + 1, t + sz + 1, b[i]) - t;
    } 

    int res = 0;
    sort(b + 1, b + n + 1);
    for(int i = 1; i <= n; i ++){
        add(a[i], 1);
        res += ask(1, b[i] - 1);
    } 
    cout << res ;
}

T5

对每个国家求方案,用乘法原理算到一起

T6

题目其实挺简单的,明显是二分。没看到按顺序分配,导致以为很难。

bool check(int M) {
    for(int i = 1; i <= n; i ++){
        if(a[i] > M) {
            return false;
        }
    }
    int remain = M;
    int res = 1;
    for(int i = 1; i <= n; i ++){
        fg:
        if(a[i] + b[i] <= remain) {
            remain -= a[i] + b[i];
        }
        else if(a[i] <= remain){
            int t = a[i] + b[i] - remain;
            res += (t + M - 1) / M;
            remain = M - t % M;
        }   
        else if(a[i] > remain) {
            res ++;
            remain = M;
            goto fg;
        }
    } 
    return res <= T;
}

void solve(){
    cin >> n >> T;
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
    }
    for(int i = 1; i <= n; i ++){
        cin >> b[i];
    }
    b[n] = 0; 
    if(check(3600) == false) {
        cout << -1;
        return ;
    }
    int l = 1, r = 3600;
    while(l < r) {
        int mid = l + r >> 1;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    cout << l;
}

总体评价

cd 1400 大概就能 AK,但是我一开始做的不太好。