Codeforces Round 892 (Div. 2)

手速慢了,掉分

C. Another Permutation Problem

Problem - C - Codeforces

题意

给定一个正整数n,设序列pn的排列,求i=1npi×imaxj=1npj×j的最大值。

思路

打表可知,答案的排列一定为翻转一部分后缀。暴力枚举要翻转的后缀即可。

代码

void solve() {
    int n;
    cin >> n;

    int ans = 0;
    for(int i = 1; i < n; i++) {
        ans += i * i;
    }

    for(int i = 0; i < n; i++) {
        int x = 0, y = 0, mx = 0;
        for(int j = 1; j <= i; j++) {
            x += j * j;
            mx = max(mx, j * j);
        }
        
        for(int j = n, k = i + 1; j > i; j--, k++) {
            y += k * j;
            mx = max(mx, k * j);
        }

        ans = max(ans, x + y - mx);
    }

    cout << ans << "\n";
}

D. Andrey and Escape from Capygrad

Problem - D - Codeforces

题意

给定一些包含区间,[l,r]包含区间[a,b],如果一个人在区间[l,r]内,那么他可以传送到区间[a,b]中的任意点。现给定一些坐标,求从该总表出发,最大能传送到的坐标在哪里。

思路

题意可简化为有若干个区间[l,b],在区间[l,b]内可传送到端点b,求最大能传送到的坐标。

先合并重合的区间,再对于每个询问的坐标,二分找到所在的区间。若该坐标不在任何区间,则答案为它自已。

代码

void solve() {
    int n;
    cin >> n;
 
    vector<array<int, 2>> seg(n);
    for(int i = 0; i < n; i++) {
        int l, r, a, b;
        cin >> l >> r >> a >> b;
        seg[i] = {l, b};
    }
 
    sort(seg.begin(), seg.end());
 
    vector<array<int, 2>> a;
    for(int i = 0; i < n; i++) {
        if(!a.empty() && a.back()[1] >= seg[i][0]) {
            a.back()[1] = max(a.back()[1], seg[i][1]);
        } else {
            a.push_back({seg[i][0], seg[i][1]});
        }
    }
 
    int q;
    cin >> q;
 
    while(q--) {
        int x;
        cin >> x;
 
        int p = lower_bound(a.begin(), a.end(), array{x + 1, 1}) - a.begin() - 1;
        if(p >= 0) {
            x = max(x, a[p][1]);
        }
        cout << x << " ";
    }
 
    cout << "\n";
}
posted @   wuyoudexian  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示