乐于分享
好东西不私藏

看我如何用AI把2024年CSP-S真题[染色]P11233 AC的

看我如何用AI把2024年CSP-S真题[染色]P11233 AC的
用AI到底能不能解信奥题?
我这次又用AI来做CSP-S的真题了,提前告诉大家,我用AI一次性AC的。
在我使用AI工具前,早在年初就有网友家长跟我聊天,说他部署了龙虾来辅助孩子进行信奥学习。
我这段时间不断使用AI来摸索,于是今天突然想起这位网友朋友,于是又联系他,询问他给孩子用AI辅助的情况。
没想到的是,他放弃了龙虾辅助。原因就是AI在DP类题目时,胡说八道。
我之前用过AI测试做省选/NOI-难度的题继续完善信奥辅助学习系统,拿AI测试省选/NOI-难度的题
当时测试的结果还是可以的,至少题目是AC了。
今天听闻这位家长朋友所说,AI对DP题胡说,我的第一意识是不应该啊。
于是今晚我决定从CSP-S真题中选择一道跟DP类相关的题再做测试。
在洛谷中选择了P11233 [CSP-S 2024] 染色这道题,网上的标签是:动态规划、线段树、动态规划优化、前缀和;难度:提高。
题目,我就不罗列出来了。我是直接在洛谷上点的它页面中的“复制Markdown”。
题目直接甩给AI,不过我紧跟着在后面输入了一些提示词:
图中的那个“信奥解题方法”是我提炼的一套解题思路和步骤,同时丢给AI就是让他按这个方法去做题,并且同时还给了一段代码。
这个代码是我从儿子之前做的题,随便选了一个,告诉AI代码的格式而已。
AI是用Py写正解,然后做暴力逻辑对拍验证,最终再把Py代码改成C++代码。
这次我使用的大模型是Deepseek-V4-Flash,时间有十几分钟,忘记看时间了。
最终交付的代码是AC级别的。
说实话,有些让我意外。
我还以为代码多多少少会有些问题,因为之前也有给的代码是部分正确的。
AC代码如下:
// P11233 [CSP-S 2024] 染色// 解法:动态规划 + 懒标记优化,O(n log n),可过 2e5//// 状态设计(核心难点)://   dp[i][x] = 处理完前 i+1 个数后,与 A[i] 异色的那个颜色,其"最后一个元素的值"为 x 时的最大得分//   约定 x = 0 表示该颜色还没有任何元素(哨兵)。//   理由:只有"异色颜色的最后一个元素"会参与未来的决策(详见转移②),这就是唯一需要保留的历史信息。//// 转移(加入 A[i+1])://   ① 同色:A[i+1] 染成与 A[i] 相同的颜色//        dp[i+1][x] = dp[i][x] + (A[i+1]==A[i] ? A[i+1] : 0)      // x 不变//   ② 异色:A[i+1] 染成相反颜色,A[i] 成为新异色颜色的最后一个元素//        dp[i+1][A[i]] = max_x ( dp[i][x] + (A[i+1]==x ? A[i+1] : 0) )//      (A[i+1] 与 A[i] 异色后,它前面最近的同色元素就是原来那个异色颜色的最后元素 x)//// 优化://   ① 对每个 x 加同一个常数 add -> 全局懒标记 lazy,best[x] 只存相对值//   ② 转移②只需两个量:best[A[i+1]] + A[i+1]  和  max_{x != A[i+1]} best[x]//      -> multiset 按相对值排序,取最大、跳过目标值,O(log n)//   ③ 注意:转移②必须用"转移前"的实际值(old lazy),不能包含本次同色加的 add#include<bits/stdc++.h>using namespace std;using ll = long long;const ll NEG = -(1LL << 60);intmain(){    ios::sync_with_stdio(false);    cin.tie(0), cout.tie(0);    int T;    cin >> T;    while (T--) {        int n;        cin >> n;        vector<inta(n);        for (int i = 0; i < n; i++) cin >> a[i];        unordered_map<int, ll> rel;   // 值 -> 相对得分(实际得分 = 相对值 + lazy)        multiset<pair<ll, int>> st;   // (相对值, 值),按相对值降序取最大        ll lazy = 0;                  // 全局懒标记        rel[0] = 0;                   // 哨兵:异色颜色还没有元素        st.insert({00});        // 取"相对值最大且值 != v"的那个元素的(相对值+old),实际得分;不存在返回 NEG        auto top_except = [&](int v, ll old) -> ll {            while (!st.empty()) {                auto it = prev(st.end());                auto f = rel.find(it->second);                if (f != rel.end() && f->second == it->first) break// 未过期                st.erase(it);                                        // 过期条目            }            if (st.empty()) return NEG;            auto it = prev(st.end());            while (it != st.begin() && it->second == v) --it;        // 跳过值 == v 的            if (it->second == v) return NEG;                          // 全是 v(不会发生,哨兵 0 永在)            return it->first + old;        };        for (int i = 0; i + 1 < n; i++) {            ll add = (a[i + 1] == a[i]) ? (ll)a[i + 1] : 0;            ll old = lazy;            // 转移前的偏移            lazy += add;              // ① 同色转移:所有状态统一加 add            // ② 异色转移:M = max( best[A[i+1]] + A[i+1], max_{x != A[i+1]} best[x] )(转移前实际值)            ll M = NEG;            auto f = rel.find(a[i + 1]);            if (f != rel.end()) M = max(M, f->second + old + (ll)a[i + 1]);            M = max(M, top_except(a[i + 1], old));            // 写入目标状态:异色后 A[i] 成为异色颜色的最后一个元素            ll nv = M - lazy;         // 转回相对值            auto it = rel.find(a[i]);            if (it == rel.end()) {                rel[a[i]] = nv;                st.insert({nv, a[i]});            } else if (nv > it->second) {                st.erase(st.find({it->second, a[i]}));                it->second = nv;                st.insert({nv, a[i]});            }        }        // 答案 = lazy + 最大相对值        while (!st.empty()) {            auto it = prev(st.end());            auto f = rel.find(it->second);            if (f != rel.end() && f->second == it->first) break;            st.erase(it);        }        cout << lazy + prev(st.end())->first << '\n';    }    return 0;}
作为在CSP-J/S阶段,用AI做题,我觉得在AI提示词调试到位的情况下,是能够帮助做题的。
当然这里的所说的帮助并不是用AI给出答案,由于AI具有上下文记忆及智能性,所以孩子可以对题目中不理解的部分进行追问。
甚至就是对给出的代码不理解的,也能直接复制代码,再给AI提问,问它为什么。
其实用AI做题,主要就是担心孩子直接抄答案。如果运用得当,AI就是你孩子24小时在线的老师,还是有问必答,可以打破砂锅问到底!

谢谢阅读,感谢点赞关注,我们一起交流分享,让生活变得更美好!

从信奥娃父母角度出发,记录作为父母要怎么助力孩子学习信奥:

自己走过的坑都在里面记录,持续更新中……

代码背后的守望:信奥赛道的父母修炼之路