sz_jinzikai 2024-07-24 17:21 采纳率: 22.2%
浏览 2
已结题

分块7pts求debug

洛谷P2787,分块只有7分,求调:

// # pragma GCC optimize("Ofast,no-stack-protector")
//
// # pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

# include <bits/stdc++.h>

# define I return

# define AK 0

# define IOI ;

using namespace std;

typedef long long ll;

typedef pair <int, int> pii;

int n, m, op, l, r, t, col[50005], st[230], ed[230], lazy[230], s[230][30], a[50005];

string str;

char c;

void init () {

    t = sqrt (n);

    for (int i = 1; i <= t; ++ i)
        st[i] = n / t * (i - 1) + 1, ed[i] = n / t * i;

    ed[t] = n;

    for (int i = 1; i <= t; lazy[i] = -1, ++ i)
        for (int j = st[i]; j <= ed[i]; ++ j)
            col[j] = i, ++ s[i][a[j]];

    return ;

}

void pushdown (int x) {

    if (~lazy[x]) {

        for (int i = st[x]; i <= ed[x]; ++ i)
            a[i] = lazy[x];

        lazy[x] = -1;

    }

    return ;

}

int find (const int l, const int r, const int k) {

    const int cl = col[l], cr = col[r];

    int sum = 0;

    pushdown (cl);

    if (cl == cr) {

        for (int i = l; i <= r; ++ i)
            sum += (a[i] == k);

        return sum;

    }

    for (int i = l; i <= ed[cl]; ++ i)
        sum += (a[i] == k);

    for (int i = cl + 1; i < cr; ++ i)
        sum += s[i][k];

    pushdown (cr);

    for (int i = st[cr]; i <= r; ++ i)
        sum += (a[i] == k);

    return sum;

}

void change (const int l, const int r, const int k) {

    const int cl = col[l], cr = col[r];

    pushdown (cl);

    if (cl == cr) {

        for (int i = l; i <= r; ++ i)
            -- s[cl][a[i]], ++ s[cl][k], a[i] = k;

        return ;

    }

    for (int i = l; i <= ed[cl]; ++ i)
        -- s[cl][a[i]], ++ s[cl][k], a[i] = k;

    for (int i = cl + 1; i < cr; ++ i) {

        for (int j = 0; j < 26; ++ j)
            s[i][j] = 0;

        s[i][k] = ed[i] - st[i] + 1;

        lazy[i] = k;

    }

    pushdown (cr);

    for (int i = st[cr]; i <= r; ++ i)
        -- s[cr][a[i]], ++ s[cr][k], a[i] += k;

    return ;

}

void sort (int l, int r) {

    const int cl = col[l], cr = col[r];

    pushdown (cl);

    if (cl == cr) {

        sort (a + l, a + r + 1);

        return ;

    }

    int sum[30] = {}, now = 0;

    for (int i = l; i <= ed[cl]; ++ i)
        ++ sum[a[i]];

    for (int i = cl + 1; i < cr; ++ i)
        for (int j = 0; j < 26; ++ j)
            sum[j] += s[i][j];

    pushdown (cr);

    for (int i = st[cr]; i <= r; ++ i)
        ++ sum[a[i]];

    for (int i = l; i <= ed[cl]; ++ i) {

        -- s[cl][a[i]], ++ s[cl][now], a[i] = now, -- sum[now];

        while (now < 26 && ! sum[now])
            ++ now;

    }

    for (int i = cl + 1; i < cr; ++ i)
        if (sum[now] >= ed[i] - st[i] + 1) {

            for (int j = 0; j < 26; ++ j)
                s[i][j] = 0;

            s[i][now] = ed[i] - st[i] + 1;

            sum[now] -= ed[i] - st[i] + 1;

            lazy[i] = now;

            while (now < 26 && ! sum[now])
                ++ now;

        } else for (int j = st[i]; j <= ed[i]; ++ j) {

                -- s[cr][a[j]], ++ s[cr][now], a[j] = now, -- sum[now];

                while (now < 26 && ! sum[now])
                    ++ now;

            }

    for (int i = st[cr]; i <= r; ++ i) {

        -- s[cr][a[i]], ++ s[cr][now], a[i] = now, -- sum[now];

        while (now < 26 && ! sum[now])
            ++ now;

    }

    return ;

}

int main () {

    ios::sync_with_stdio (0);

    cin.tie (0);

    cout.tie (0);

    cin >> n >> m >> str;

    for (int i = 0; i < n; ++ i)
        a[i + 1] = str[i] >= 'a' ? str[i] - 'a' : str[i] - 'A';

    init ();

    while (m --) {

        cin >> op >> l >> r;

        if (op < 2)
            cin >> c, cout << find (l, r, c >= 'a' ? c - 'a' : c - 'A') << '\n';
        else if (op < 3)
            cin >> c, change (l, r, c >= 'a' ? c - 'a' : c - 'A');
        else
            sort (l, r);

    }

    I AK IOI

}

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-07-24 17:23
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    您的代码是针对洛谷P2787题目的C++实现,该题目要求实现一个支持查询、修改和排序操作的字符串数据结构。从您提供的代码中,我注意到几个可能的问题点,以下是一些建议和分析:

    1. 初始化问题: 您的init函数中初始化了col数组来标记每个元素属于哪个块,但是s数组的初始化似乎并没有正确处理。s数组用于存储每个块中每个字符出现的次数,您需要确保每个字符在s数组中初始化为0。

    2. 懒标记更新: 在change函数中,您使用了懒标记lazy来优化区间修改操作。但是,您的更新逻辑可能需要调整。当更新一个块时,您需要确保子块也正确地接收到更新信息,并且懒标记应该在适当的时候被更新。

    3. 排序算法sort函数的逻辑看起来比较复杂,可能存在逻辑错误。排序算法需要正确地更新s数组和a数组,并且确保排序后的结果满足题目要求。

    4. 输入输出宏定义: 使用IIOI作为宏定义可能会使代码的可读性降低。建议使用更直观的语句来代替这些宏定义。

    5. 代码风格: 代码中存在一些不一致的命名和风格问题,如混合使用大小写、不一致的空格使用等,这些都可能影响代码的可读性和调试。

    6. 边界条件处理: 在处理区间操作时,需要特别注意边界条件。例如,在changesort函数中,确保处理了区间的起始和结束位置。

    7. 测试用例: 为了调试代码,建议使用一些测试用例来验证每个函数的正确性。特别是对于边界条件和特殊情况,确保代码能够正确处理。

    8. 调试建议

      • 使用调试器逐步执行代码,观察在每个函数调用时变量的值。
      • 在关键位置添加打印语句,输出中间结果,帮助理解程序的执行流程。
    9. 代码审查

      • 考虑让其他有经验的程序员审查您的代码,他们可能会发现您没有注意到的问题。
    10. 优化: 如果代码在某些测试用例上表现不佳,考虑是否有优化的空间,比如减少不必要的操作或者改进数据结构。

    请注意,这些建议是基于代码审查的结果,没有实际运行和测试代码。如果您能够提供更多的上下文信息,例如具体的错误输出或者测试用例,我可以提供更具体的帮助。此外,如果您需要对特定部分的代码进行深入分析或者修复,请提供更详细的信息。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月24日
  • 创建了问题 7月24日