首页 > 其他分享 >Hello 2023 A-D

Hello 2023 A-D

时间:2023-01-04 14:46:42浏览次数:66  
标签:geq 刀片 int long solve 2023 Hello cout

比赛链接

A

题意

给一个字符串每个物品对应的灯的照明方向,L/R 能照亮它左侧/右侧的所有物品(不包括自己对应的物品),现在能交换相邻两个灯一次(不改变照明方向),问能否找亮所有物品。

题解

知识点:贪心。

显然,如果存在 LRRL 就可以照亮全部,否则全是 LR 就不可行。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long

using namespace std;

bool solve() {
    int n;
    cin >> n;
    string s;
    cin >> s;
    s = "?" + s;
    for (int i = 1;i < n;i++) {
        if (s[i] != s[i + 1]) {
            if (s[i] == 'L') cout << i << '\n';
            else cout << 0 << '\n';
            return true;
        }
    }
    return false;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << -1 << '\n';
    }
    return 0;
}

B

题意

构造一组数,使得任意相邻两项之和等于全部和。

题解

知识点:构造。

\(n\) 为偶数时,构造 \(1,-1,1,-1,\cdots\) 即可。

\(n\) 为奇数时,显然奇数项和偶数项要各自相等,随后由 \(a_1+\cdots+a_n = a_{n-1}+a_{n}\) 可以得到 \((n-1)a_1+(n-3)a_2 = 0\) ,取 \(a_1 = n-3,a_2 = 1-n\) 即可,只有 \(n=3\) 时无解(因为 \(a_1 = 0\))。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long

using namespace std;

bool solve() {
    int n;
    cin >> n;
    if (n & 1) {
        if (n == 3) return false;
        cout << "YES" << '\n';
        for (int i = 1;i <= n;i++) {
            if (i & 1) cout << n - 3 << ' ';
            else cout << 1 - n << ' ';
        }
        cout << '\n';
    }
    else {
        cout << "YES" << '\n';
        for (int i = 1;i <= n;i++) {
            if (i & 1) cout << 1 << ' ';
            else cout << -1 << ' ';
        }
        cout << '\n';
    }
    return true;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << "NO" << '\n';
    }
    return 0;
}

C

题意

给一组数,可以修改元素变成其相反数。问最少修改几次,可以使得第 \(m\) 个前缀和 \(a_1+\cdots+a_m\) 是所有前缀和里最小的。

题解

知识点:前缀和,数学,贪心。

定义 \(a[l,r] = a_l+\cdots+a_r\) 。

当 \(k\in [1,m-1]\) 时

\[\begin{aligned} a[1,k] &\geq a[1,m]\\ a[1,k] &\geq a[1,k] + a[k+1,m]\\ 0 &\geq a[k+1,m] \end{aligned} \]

当 \(k\in [m+1,n]\) 时

\[\begin{aligned} a[1,k] &\geq a[1,m]\\ a[1,m] + a[m+1,k] &\geq a[1,m]\\ a[m+1,k] &\geq 0 \end{aligned} \]

所以只要保证任意 \(i\in[2,m]\) ,满足 \(a[i,m]\leq 0\) ;任意 \(i\in[m+1,n]\) ,满足 \(a[m+1,i] \geq 0\) 即可。

每次操作时,贪心地取最优的即可。

时间复杂度 \(O(n\log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long

using namespace std;

int a[200007];
bool solve() {
    int n, m;
    cin >> n >> m;
    for (int i = 1;i <= n;i++) cin >> a[i];
    int cnt = 0;
    multiset<int> ms;
    ll sum = 0;
    for (int i = m;i >= 2;i--) {
        sum += a[i];
        ms.insert(a[i]);
        if (sum > 0) {
            sum -= 2 * (*prev(ms.end()));
            ms.erase(prev(ms.end()));
            cnt++;
        }
    }
    ms.clear();
    sum = 0;
    for (int i = m + 1;i <= n;i++) {
        sum += a[i];
        ms.insert(a[i]);
        if (sum < 0) {
            sum -= 2 * (*ms.begin());
            ms.erase(ms.begin());
            cnt++;
        }
    }
    cout << cnt << '\n';
    return true;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << -1 << '\n';
    }
    return 0;
}

D

题意

给定一组头发长度 \(a_i\) ,以及理想头发长度 \(b_i\) 。

理发师有刀片 \(x_i\) ,每个刀片只能用一次,每次可以修减一段连续区间的头发,满足 \(a'_i = \min(a_i,x),i\in[L,R]\)。

问理发师能不能通过这些刀片将 \(a\) 修剪至 \(b\) 。

题解

知识点:单调栈。

显然 \(a_i<b_i\) 无解。

利用最大值单调栈维护刀片的值。以下按顺序满足:

  1. \(b_i\) 大于栈顶刀片,则栈顶刀片因为太小不能再用了,刀片需要出栈直至 \(b_i\) 小于等于栈顶刀片或栈空。
  2. \(b_i = a_i\) ,说明 \(b_i\) 不需要修剪,什么都不用干。
  3. \(b_i \neq a_i\) ,说明 \(b_i\) 需要修剪,此时如果 \(b_i\) 小于栈顶刀片或栈空,则需要使用新的刀片,满足 \(x = b[i]\) ,如果不存在这个刀片则无解。

全部满足后,即 YES

代码

#include <bits/stdc++.h>
#define ll long long

using namespace std;

int a[200007];
int b[200007];
bool solve() {
    int n;
    cin >> n;
    for (int i = 1;i <= n;i++) cin >> a[i];
    for (int i = 1;i <= n;i++) cin >> b[i];
    int m;
    cin >> m;
    map<int, int> mp;
    for (int i = 1;i <= m;i++) {
        int x;
        cin >> x;
        mp[x]++;
    }
    stack<int> st;
    for (int i = 1;i <= n;i++) {
        if (a[i] < b[i]) return false;
        while (!st.empty() && b[i] > st.top()) st.pop();
        if (a[i] != b[i]) {
            if (st.empty() || b[i] < st.top()) {
                if (mp[b[i]]) {
                    mp[b[i]]--;
                    st.push(b[i]);
                }
                else return false;
            }
        }
    }
    cout << "YES" << '\n';
    return true;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--) {
        if (!solve()) cout << "NO" << '\n';
    }
    return 0;
}

标签:geq,刀片,int,long,solve,2023,Hello,cout
From: https://www.cnblogs.com/BlankYang/p/17024753.html

相关文章

  • 2023年DDL日历
    2023年DDL日历 新的一年,新的DDL...qwq1月星期一星期二星期三星期四星期五星期六星期天      1       2345678  ......
  • MongoDB6.0的安装「2023年」
    你好,我是悦创。优质原文格式:https://bornforthis.cn/column/crawler/supplement/mongodb-install.html点进去有惊喜。吐槽,这篇博客的产生是因为本人被MongoDB的安装坑......
  • Codeforces Hello 2023 CF 1779 A~F 题解
    点我看题A.HallofFame先把不用操作就合法的情况判掉。然后发现交换LL,RR,RL都是没用的,只有交换LR是有用的,这样可以照亮相邻的两个位置。所以我们就是要找到一个位置i,......
  • Codeforces Hello 2023 CF 1779 A~F 题解
    点我看题A.HallofFame先把不用操作就合法的情况判掉。然后发现交换LL,RR,RL都是没用的,只有交换LR是有用的,这样可以照亮相邻的两个位置。所以我们就是要找到一个位置i,......
  • Hello 2023
    Hello2023A-Dhttps://codeforces.com/contest/1779后面的还没看A.HallofFameLR->RL,修改一个即可覆盖全部#include<bits/stdc++.h>usingnamespacestd;void......
  • 2022再也不见,2023温柔以待!
    引用007电影里面的一句经典台词:世事难以预料啊。 一、5年的感情修炼,遗憾未能正果!  16年和她相识相知,那会儿她刚高考完,我已经是大学毕业工作了5年的中年大哥。从开着......
  • 2023/1/3
    好多天没更了...第三题卡住了,头大,不知道报告怎么写了...z3总要出来些奇奇怪怪的东西去攻防世界找了道菜鸡题,拿了一分,感觉还不错先搞点菜鸟网站找找自信吧...汇编嘛,还......
  • 2023.1.3
    本来今天是不想写得,但是明天不练车,所以说还是写了吧,嘿嘿。碎碎念:今天阳光明媚,心情很不错!去办理身份证,非常顺利,拍身份证之前洗了一把脸,冲拍照的小哥哥要的卫生纸,最后扔垃圾没......
  • 工作感受月记202301月
     2023年01月03日新年来了,新的工作态度呢?积极向上,好好学习。努力就能成功,坚持就是胜利。今天工作内容有:1/清理手中旧案例,跟进后,可以关闭两个。2/完成与Lucas的gi......
  • 1.2 SMU Winter 2023 蓝桥杯模拟赛 1
    [蓝桥杯2013省B]带分数题意:给n,使满足式子a+b/c=n,其中a,b,c共同恰好由1,2...9组成,求a,b,c的取值种数思路1:枚举出9个数的全排列(可使用next_permutation()),再用两重循环暴......