第十四届蓝桥杯三月真题刷题训练——第 16 天 (3.19)

学习算法的小菜鸡 每日一题总教官 2023-03-19 14:23:14

火星旅行

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

using namespace std;

const int N = 1e6 + 10;
int s[N * 2];
int o[N], d[N];
int n;
bool ans[N];

signed main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> o[i] >> d[i];
    }
    for (int i = 1; i <= n; i++) {
        s[i] = o[i] - d[i];
        s[i + n] = s[i];
    }
    for (int i = 1; i <= 2 * n; i++) {
        s[i] += s[i - 1];
    }
    deque<int>qu;
    qu.push_back(2 * n + 1);
    for (int i = 2 * n; i >= 1; i--) {
        if (qu.size() && qu.front() > i + n - 1) qu.pop_front();
        if (i < n) {
            if (s[qu.front()] - s[i - 1] >= 0) ans[i] = true;
        }
        while (qu.size() && s[qu.back()] >= s[i - 1]) qu.pop_back();
        qu.push_back(i - 1);
    }
    d[0] = d[n];
    for (int i = 1; i <= n; i++) {
        s[i] = o[i] - d[i - 1];
        s[i + n] = s[i];
    }
    for (int i = 1; i <= 2 * n; i++) {
        s[i] += s[i - 1];
    }
    qu.clear();
    qu.push_back(0);
    for (int i = 0; i <= 2 * n - 1; i++) {
        if (qu.size() && qu.front() < i - n + 1) qu.pop_front();
        if (i + 1 > n) {
            if (s[i + 1] - s[qu.front()] >= 0) ans[i - n + 1] = true;
        }
        while (qu.size() && s[qu.back()] <= s[i + 1]) qu.pop_back();
        qu.push_back(i + 1);
    }
    for (int i = 1; i <= n; i++) {
        if (ans[i]) puts("TAK");
        else puts("NIE");
    }
}

推导部分和

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

using namespace std;

const int N = 1e6 + 10;
int n, m, q;
int p[N];
int sum[N];

int find(int v) {
    if (p[v] != v) {
        int rt = find(p[v]);
        sum[v] += sum[p[v]];
        p[v] = rt;
    }
    return p[v];
}

signed main() {
    cin >> n >> m >> q;
    for (int i = 1; i <= n; i++) p[i] = i;
    while (m--) {
        int a, b, c;
        cin >> a >> b >> c;
        int pa = find(a - 1), pb = find(b);
        if (pa != pb) {
            p[pb] = pa;
            sum[pb] = sum[a - 1] - sum[b] + c;
        }
    }
    while (q--) {
        int a, b;
        cin >> a >> b;
        int pa = find(a - 1), pb = find(b);
        if (pa != pb) {
            cout << "UNKNOWN" << endl;
        }
        else {
            cout << sum[b] - sum[a - 1] << endl;
        }
    }
}
...全文
66 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
TralSun 2023-03-19
  • 打赏
  • 举报
回复 1

醍醐灌顶,太妙了🤩

学习算法的小菜鸡 每日一题总教官 2023-03-19
  • 举报
回复
@TralSun 是你太强了
TralSun 2023-03-19
  • 打赏
  • 举报
回复

%%%%%%%%%%%%%%%%%%%%%%

50,781

社区成员

发帖
与我相关
我的任务
社区描述
和众多高校算法内卷分子,一起学习和交流算法那。浓郁的算法交流氛围,拒绝躺平,有效内卷。加入我们,私信我拉你入核心内卷群。
算法数据结构leetcode 个人社区
社区管理员
  • 执 梗
  • Dream-Y.ocean
  • ღCauchyོꦿ࿐
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

 刷题!

试试用AI创作助手写篇文章吧