2024.4 模拟赛日志

2024 年 syzx 春季训练 1(20240315)

https://www.cnblogs.com/caijianhong/p/18076181

SS240323(20240323)

http://cplusoj.com/d/senior/contest/65fd9320ccaa6dc9eee1e44f

  • [A 魔环上的树] 计数,数树,平面图三角剖分(的结构)
  • [B 序列舞蹈] 斜率相关,数据结构
  • C 脱单计划 最小费用最大流,曼哈顿距离转化

\(100+100+100=300\)

冲刺NOI2024联测1(20240329)

http://47.92.197.167:5283/contest/482

  • [A 帽子] 序列构造双射的构造题
  • [B 我希望你们永远不要用到的洗牌法] 很困难写的分治贪心题
  • [C 一路向“北” / CF1621H Trains and Airplanes] 数据结构,整除分段的值

\(10+35(50)+40(30)=85(90)\)

反思:T1 想错方向了,往相邻颜色上面想(具体见题目),没有发现是一个构造题;T2 的暴力 dp 复杂度写成 \(O(n^4)\) 了,以为是 \(O(n^3)\) 的。然后正解也不是很会,很像省选 D2T1 迷宫守卫,这种贪心题是一个弱点。T3 结束前半小时大概知道怎么做,结果没写完,下午写完了发现有一部分是假的,但是离正解也很近。然后这个 T3 还重写了一遍。

线段树合并新写法
  1. 定义 static 的数组可以不写数组大小
  2. 如果 static 函数与 std 重名(如下面的 merge),需要指明
int T;
struct segtree {
  static constexpr int N = 200010 << 6;
  static int ch[N + 10][2], tot, ans[N + 10];
  static void maintain(int p) { ans[p] = ans[ch[p][0]] + ans[ch[p][1]]; }
  static void insert(int x, int k, int &p, int l, int r) {
    if (!p) p = ++tot;
    if (l == r) return ans[p] += k, void();
    int mid = (l + r) >> 1;
    if (x <= mid)
      insert(x, k, ch[p][0], l, mid);
    else
      insert(x, k, ch[p][1], mid + 1, r);
    maintain(p);
  }
  static int merge(int p, int q, int l, int r) {
    if (!p || !q) return p + q;
    int z = ++tot;
    if (l == r) return ans[z] = ans[p] + ans[q], z;
    int mid = (l + r) >> 1;
    ch[z][0] = merge(ch[p][0], ch[q][0], l, mid);
    ch[z][1] = merge(ch[p][1], ch[q][1], mid + 1, r);
    maintain(z);
    return z;
  }
  static int query(int L, int R, int p, int l, int r) {
    if (!p) return 0;
    if (L <= l && r <= R) return ans[p];
    int mid = (l + r) >> 1;
    int ret = 0;
    if (L <= mid) ret += query(L, R, ch[p][0], l, mid);
    if (mid < R) ret += query(L, R, ch[p][1], mid + 1, r);
    return ret;
  }
  int root = 0;
  void insert(int x, int k) { insert(x, k, root, 0, T - 1); }
  static segtree merge(segtree a, segtree b) {
    return {merge(a.root, b.root, 0, T - 1)};
  }
  int query(int L, int R) { return query(L, R, root, 0, T - 1); }
  int qall() { return query(0, T - 1, root, 0, T - 1); }
};
int segtree::ch[][2], segtree::tot, segtree::ans[];
int n, Q, K, col[200010];
vector<pair<int, int>> g[200010];
segtree t[200010][26];
int top[200010];
LL det[200010], f[26], w[26];
void dfs(int u, int fa, int topf) {
  top[u] = topf;
  t[u][col[u]].insert((det[u] - 1) % T, 1);
  for (auto e : g[u]) {
    int v = e.first, w = e.second;
    if (v == fa) continue;
    if (col[v] == col[u])
      det[v] = det[u] + w, dfs(v, u, topf);
    else
      det[v] = w, dfs(v, u, u);
    for (int j = 0; j < K; j++) t[u][j] = segtree::merge(t[u][j], t[v][j]);
  }
}

原来以为是单点的,写的 dsu on tree。大家可以欣赏一下狗屎 shared_ptr 代码。其实线段树更好写更短。

struct dsuontree {
    int me;
    int buc[200010], tot, rsz[200010];
    vector<pair<int, shared_ptr<int>>> qry[200010];
    map<int, int> mp;
    shared_ptr<int> ask(int u, int T) {
        if (T >= 0) {
            shared_ptr<int> ansp = make_shared<int>(-1);
            if (!mp.count(T)) {
                int t = mp.size();
                mp[T] = t;
            }
            qry[u].emplace_back(mp[T], ansp);
            return ansp;
        } else {
            return shared_ptr<int>(&rsz[u], [](int*) {});
        }
    }
    void dfs(int u, int fa, int ban, int k) {
        if (col[u] == me && det[u] >= 0)
            buc[det[u]] += k, tot += k;
        for (auto e : g[u]) {
            int v = e.first;
            if (v == fa || v == ban)
                continue;
            dfs(v, u, ban, k);
        }
    }
    void solve(int u, int fa, bool keep) {
        if (col[u] == me)
            det[u] = mp.count(det[u] % T) ? mp[det[u] % T] : -1, rsz[u] = 1;
        for (auto e : g[u]) {
            int v = e.first;
            if (v == fa || v == son[u])
                continue;
            solve(v, u, false);
            rsz[u] += rsz[v];
        }
        if (son[u])
            solve(son[u], u, true), rsz[u] += rsz[son[u]];
        dfs(u, fa, son[u], 1);
        for (auto q : qry[u]) *q.second = buc[q.first];
        if (!keep)
            dfs(u, fa, 0, -1);
    }
} robot[26];
struct func {
    map<int, LL> mp;  // record delta
    map<int, shared_ptr<int>> ques;
    shared_ptr<int> all;
    LL gen = 0;
    void askall(int me, int u) {
        for (auto e : mp) ques[e.first] = robot[me].ask(u, e.second);
        all = robot[me].ask(u, -1);
    }
    LL answer() {
        int gall = *all;
        for (auto e : ques) gall -= *e.second;
        if (gall)
            return gen;
        LL mn = 1e18;
        for (auto e : ques) {
            if (*e.second)
                mn = min(mn, mp[e.first]);
        }
        return mn + gen;
    }
};

2024 年 syzx 春季训练 2(20240331)

https://vjudge.net.cn/contest/617477

冲刺NOI2024联测2(20240330)

http://47.92.197.167:5283/contest/483

  • [A 签到题] 构造,平面图三角剖分(的结构)
  • [B 简单题] 构造,整除相关
  • [C 模板题] 多项式,连通图计数

\(100+100+100=300\)

T1 原题。T3 是模板题,卡常卡过去了。如果题目问什么什么的奇数的情况,可以考虑求总数和偶数 - 奇数,这个技巧考虑一下。T2 打表瞪出来的,感觉正解也差不多?整除相关的可以注意一下因子 \(2\)

\(G_1(n)-G_0(n)=(-1)^{n}(n-1)!\),其中 \(G_1(n)\) 表示恰有奇数条的 \(n\) 个点有标号连通图个数,\(G_0\) 是偶数。

冲刺NOI2024专题1:构造&交互(20240331)

*https://vjudge.net.cn/contest/619645

冲刺NOI2024联测3(20240401)

  • [A 恭喜你发现签到题(sequence)] 交互,子序列
  • [B 过山车(roller)] 轮廓线 dp / 网络流
  • [C 木棍(stick)] 差分约束、负环判定、hall 定理、线段树优化最短路

\(100+54+0(30)=154(184)\)。反思:T2 没想过网络流。T3 贪心假了,虽然看上去很明显是假的,但是没注意到。

冲刺NOI2024联测4(20240402)

  • [A 斩首] 分治优化 dp
  • [B 抓扑满挑战 / ARC128F] 贪心,格路计数,组合推导
  • [C 战争] 树上启发式合并

\(70+28+35(20)=133(118)\)。反思:T1 搞了很久的笛卡尔树分治,并最终观察到笛卡尔树分治等价于 dsu on tree 因此不是一个很有效的方向;T2 就是不会;T3 的做法有点意想不到(的诈骗),也可能是对支配对相关问题不是很会。

冲刺NOI2024专题2:dp(20240402)

https://vjudge.net.cn/contest/620019

冲刺NOI2024联测5(20240404)

  • %A 铲雪 数据结构维护带 \(\max\) 的式子,均摊分析
  • [B 游戏] 根号分治(类似),线性递推,容斥 / 组合
  • [C 海盗] 凸优化相关

\(50(60)+80(100)+7=137\)。T1 那 10 分本来以为能拿,现在看一下好像不能;T2 因为式子不太一样需要处理很恶心的无逆元,然后挂了;T3 没怎么想。

%T1 可以重新写一次。

一个函数 \(f(x)\) 是下凸的 \(\iff \forall x, y, \frac{f(x)+f(y)}{2}\geq f\left(\frac{x+y}{2}\right)\)。好吧这是定义。

冲刺NOI2024专题3:数论和组合数学(20240404)

*https://vjudge.net.cn/contest/620552

冲刺NOI2024联测6(20240405)

  • [A star] 神秘构造,调整法
  • [B rescue] 数据结构,根号重构
  • [C text] Lyndon Word,生成函数计数(ln,莫反)

\(0(8)+40+8=48(56)\)。T1 只过了一个人。T2 只过了一个人。反思:T1 不会判无解,实际上无解条件非常智障;然后构造的方法可以构造出环;总结:T1 是论文题。T2 根本看不出根号重构,以为是 polylog;T3 根本不会 Lyndon Word 理论,要学。

冲刺NOI2024联测7(20240406)

  • [A 排列] 数论(exgcd,同余最短路)
  • [B 数据删除] 博弈论,数据结构维护函数复合
  • [C 不要恐慌] dp,数据结构优化,“格路”计数

\(100(0)+100+70=270(170)\)。T1 不会同余最短路,然后学习了 Alex_Wei 老师的转圈法。T2 比较简单就不说了;T3 没想到转化,写的 \(O(m^2\log n)\) 比较麻烦,很难优化,然后 std 有另外的思路。

冲刺NOI2024专题4:代数、多项式类(20240407)

*https://vjudge.net.cn/contest/621071

冲刺NOI2024联测8(20240408)

  • [A 树(toptree)] 改变重链剖分的标号
  • [B 考拉爆炸 (koalabomb) ] 概率与期望,对称,\(\min-\max\) 容斥
  • [C 次方数 (pow) ] 数论,(质)因数分解,神秘复杂度分析

\(20(100)+3+35=58(138)\)。T1 被卡常。T2 方向错了一点,就可能还差那么一点性质找不到吧。T3 不用看的。

冲刺NOI2024联测9(20240409)

  • [A Limbo] 二分答案,期望 dp(带环,带 min),拆 min / 维护凸函数
  • [B 集合] 线性基,贪心,凸包优化(强行找到答案点集的凸包,由平面上整点个数不超过 \(O(V^{2/3})\) 保证复杂度)。
  • [C 比赛] 对抗 dp,dp 状态数分析和优化

\(100+40+20=160\)。T1 傻了维护了凸函数(因为之前见过维护凸包求精确值的题目),被硬控 2h 还是 2.5h 不知道。T2 没有意识到线性基这个贪心不是很对。线性基时一个拟阵,正如隔壁 Kruskal 最小生成树一样的拟阵,有两个维度的贪心的时候,必须降低一维,不能说控制某一维总和之类的会假掉,因为它是拟阵模型(话说拟阵要复习了)。T3 没想到特殊性质的用法,就是不会,或者可能是说猜错结论慌了。

高一高二恢复性杂题训练7(20240410)

http://becoder.com.cn/contest/5110

已全部完成。

高一高二恢复性杂题训练8(20240411)

http://becoder.com.cn/contest/5111

已全部完成。

多校国赛模拟赛1(20240412)

  • [A 研究所] 裴蜀定理,整体二分,线段树维护单点修改和区间 gcd(的复杂度为单次 \(O(\log n+\log V)\)
  • [B 游戏] 万能欧几里得
  • [C sunset] 笛卡尔树上用李超线段树与闵可夫斯基和等凸技巧乱做

\(100+30(20)+20(35)=150(155)\)。T1 比较简单但是好玩,T2 卡算法了不会,T3 可能是菜导致的。

NOI2024容斥原理的简单应用「重庆八中刘洋」(20240413)

http://becoder.com.cn/contest/5119

多校NOI2024国赛模拟赛2 (20240415)

http://becoder.com.cn/contest/5125

完全没看。计划是不动它。

多校NOI2024国赛模拟赛3暨重庆市友谊赛(20240416)

  • [A P8859 冒泡排序] 通过确定所计算的东西转化为对树计数,然后直接 dp。
  • [B CF452F Permutation](上树)维护 hash 值判断回文。
  • [C P9394 白鹭兰] “点双连通 耳分解 双极定向”

因为没有打,而且有可能三个题都看过(但是 T2 没想起来,T3 听的时候感冒不起 😦 ),所以没有分。

T2 的启发是:如果要多次比较两个字符串,可以考虑 hash 或者转化为回文串问题,将一些看上去不可做差卷积转化为简单形式。同时也要注意到 OI 中有很多算法能将不可做的问题转化为可做问题(……在说什么?例如最短路,不觉得能求出一个图的单源最短路是很炫酷的事情吗 qwq)

T3 就是科技题吧。这个的话就看看,也要复习。图的连通性其实还有很多没有学,一切都因为那天听 ix35 本人讲课的时候生病了。记得翻课件。有没有懂 20230804\sol2.pdf 的。

NOI2024字符串选讲1-ACAM、PAM、SA、SAM「广实黄建恒」(20240417)

http://becoder.com.cn/contest/5132

已全部完成。[AGC064C] Erase and Divide Game 是卡常的,atcoder 能过。

NOI2024字符串选讲2-基本子串结构「广实黄建恒」 (20240417)

http://becoder.com.cn/contest/5133

资料:https://www.cnblogs.com/crashed/p/17382894.htmlhttps://www.cnblogs.com/sizeof127/articles/17579027.html

多校NOI2024国赛模拟赛4(20240419)

\(100+100+100=300\)。T3 在洛谷上只有 40 分,调了块长喜提 50 分,原因是有个 \(\log\)

NOI2024简单技巧杂题选讲「成外李枨夏」(20240420)

又名:树的遍历与背包问题

http://becoder.com.cn/contest/5136

因为今天要放假,所以不写。就是故意留了两个最难写的。

多校NOI2024国赛模拟赛5(20240422)

  • [A 早八] 简单数据结构
  • [B 派对] 性质题,题意是刻画 \(p_i<j\land p_j<i\) 的排列;矩阵快速幂优化 dp
  • [C 间谍] 闵可夫斯基和;平面上凸多边形范围查询(也是查询多边形面积的方法:对每条边两个端点作垂线,改成无限长梯形(上下底平行 \(y\) 轴,一条腰是歪的,另一条腰在 \(x\) 负半轴方向无限远处)(上凸壳 - 下凸壳 = 答案),发现可以根据多边形的边的斜率分类作扫描线转化为二维数点)

\(100+55(30)+45=200(175)\)。T2 搜索搞了好多分()

多校NOI2024国赛模拟赛6(20240423)

  • [A Lethe] 费用流建模
  • [B P7811 [JRKSJ R2] 你的名字。] 根号分治,根号平衡
  • [C Gift] Polya 原理,容斥

\(40(100)+100+95(100)=235(300)\)。T1 点数开少了。T2 不想卡洛谷那个题的常数了,不写了。T3 有启发性:

\[[x^m](1+x+x^2+\cdots+x^k)^n=\sum_{i=0}^n(-1)^i\binom n i[x^{m-i(k+1)}]\left(\frac{1}{1-x}\right)^n=\sum_{i=0}^n(-1)^i\binom n i\binom{n+m - i(k+1)-1}{n-1} \]

(假设 \(k\) 是无穷大,那么这是广义二项式定理;否则枚举那些多项式乘起来的时候选了超过 \(k\) 的项,减掉相应的 \(m\),然后套用 \(k\) 无穷大的情况。)

\[\sum_{d|n}d=O(n\log \log n) \]

这是一个著名定理。

NOI2024简单杂题选讲「金华一中赵晟昊」(20240424)

又名:ACM 题目选讲

https://www.becoder.com.cn/contest/5154

https://www.becoder.com.cn/contest/5155

很困难,看着做。额怎么开始倒数了。


该用户已在现实中的 4 月 26 日中午离开重庆市第八中学校(沙坪坝校区)。

posted @ 2024-03-29 20:00  caijianhong  阅读(163)  评论(3编辑  收藏  举报