找回密码
 立即注册
首页 业界区 科技 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设 ...

【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(2)

挽幽 2025-6-6 18:22:43
比赛链接
本文发布于博客园,会跟随补题进度实时更新,若您在其他平台阅读到此文,请前往博客园获取更好的阅读体验。
跳转链接:https://www.cnblogs.com/TianTianChaoFangDe/p/18773190
开题 + 补题情况

除了 AK 题都补完了,还是学到了很多东西,以及很多平时比赛注意不到的点。
1.png

总结

这场太唐了,四个签到题做得依托答辩,罚时控制得一点也不好,之后还是应该三思后再交题,没想清楚前不要写代码,不然堆shi!
然后是补的题吧,这场题目质量挺高的(除了某个测评机问题,屮!)。
1006 属于是见识少了,很经典的博弈手法。
1001 可以迁移线性基的思想,按位考虑,位运算的题都尽可能地考虑按位考虑。
1007 DP 好题了属于是,DP 很重要的就是如何找出一个无后效性的状态,这个题就是一个很好的典范,通过扩展状态来避免乘法的后结合而导致难以维护,这题还用了自动机的想法来减少计算次数。
1008 又是对问题的转化没转化好,这个只要转化出每个点只和三个刷子的顺序就很容易想到拓扑了。
1010 很好的数据结构题,顺便复习了一下离散数学函数的相关知识,同时也体现出线段树的一个重要特点,那就是满足结合律,以及使用了前缀和来优化复杂度,通过自己定义逆运算来达成使用前缀和进行区间查询。
1002 - 学历史导致的

签到题,由于数据范围只有几十,所以直接枚举暴搜就行。
点击查看代码[code]#include #define inf 2e18#define int long longconst int N = 2e5 + 9;std::string a[] = {"jia", "yi", "bing", "ding", "wu", "ji", "geng", "xin", "ren", "gui"};std::string b[] = {"zi", "chou", "yin", "mao", "chen", "si", "wu", "wei", "shen", "you", "xu", "hai"};void solve(){    std::string s;std::cin >> s;    for(int i = 1984;i > k;    int x;    if(k.size() > 2) {        x = 100;    } else {        x = toint(k);    }    std::string tmp = s;    for(int i = 1;i < x;i ++) {        s += tmp;    }    std::vector dp(27, 0);    auto getint = [](const char c) -> int {        return c - 'a' + 1;    };    int ans = 0;    for(auto &i : s) {        int ix = getint(i);        for(int j = 0;j < ix;j ++) {            dp[ix] = std::max(dp[ix], dp[j] + 1);        }        ans = std::max(ans, dp[ix]);    }    std::cout  n;    std::vector a(n);    for(auto &i : a) {        std::cin >> i;    }    std::vector cnt(N + 9, 0), all(N + 9, 0);    std::vector vis(N + 9, 0);    for(int i = 0;i < n;i ++) {        cnt[a] ++;    }    int ans = 0;    int sum = 0;    vis[0] = true;    for(int i = n - 1;i >= 0;i --) {        if(a == 0) {            cnt[a] --;            continue;        }        if(!cnt[0])break;        int ix;        for(int j = i;j >= 0 && a[j] != 0;j --) {            cnt[a[j]] --;            ix = j;        }        for(int j = i;j >= 0 && a[j] != 0;j --) {            if(a[j] && cnt[a[j]]) {                all[a[j]] = std::max(all[a[j]], sum);            }            sum += !vis[a[j]];            vis[a[j]] = true;        }        i = ix;    }    for(int i = 1;i > k;    int ans = 0;    if(k & 1) {        std::cout  y >> z;    if((x + 2 * y) % 4 == 0) {        std::cout  n >> m;    std::vector in(n * 3 + 1, 0);    std::vector g(n * 3 + 1);    bool dk = true;    for(int i = 1;i > x >> y >> c;        int p = (y - 1) / 2 + 1, q = 2 * n - x + 1, r = 2 * n + x - y / 2;        if(!dk)continue;        if(c != p && c != q && c != r) {            dk = false;            continue;        }                if(c == p) {            g[q].push_back(c);            g[r].push_back(c);        } else if(c == q) {            g[p].push_back(c);            g[r].push_back(c);        } else {            g[p].push_back(c);            g[q].push_back(c);        }        in[c] += 2;    }    if(!dk) {        std::cout  bool {        std::queue q;        for(int i = 1;i  m >> k;    std::vector a(n + 1, std::vector(m + 1));    for(int i = 1;i  a[j];        }    }    std::vector dp(        n + 1, std::vector(            m + 1, std::array{}));    auto getdigit = [&](int x, int y, int z) -> int {        return (x * k + y) * k + z;    };    int mx = k * k * k;    for(int i = 0;i < k;i ++) {        for(int j = 0;j < k;j ++) {            for(int p = 0;p < k;p ++) {                for(char q = '0';q
您需要登录后才可以回帖 登录 | 立即注册