Loading

成都集训游记

前言

这个东西给谁看?

其实里面的题目并不是重点,而是希望有人看到后能够吊打我而保持乐观的心态振作起来,保持热爱,继续前进。

同时也是给未来的自己看,希望未来的我一定会更强。

\(07.08\)

坐高铁到成都,感觉良好,下午打了场月赛,感觉还行。

\(07.09\)

今天是数据结构专题。

题单

题目链接:Link

A Ice-cream Tycoon

我们考虑将权值离散化后搞进一颗权值线段树里,然后分治即可,要维护一个权值和总数和是否删除的标记就行了。需要注意的是,输入格式的问题。

B New Year Tree

发现可以通过 \(\text{dfs}\) 序转化成序列问题,然后用 \(\text{bitset}\) 维护每一种颜色,剩下的就是普通线段树了。

C Ping-Pong

考虑用线段树和并查集实现,对于每个端点,我们存入一颗线段树中,然后查询时,看一个节点与当前结点上区间端点的交集,然后用并查集合并一下就好了,注意要清空线段树的结点,线段树结点可以用个 \(\text{vector}\) 搞一下。

D Life as a Monster

考虑将切比雪夫距离转化为曼哈顿距离,这是一个经典问题,然后如果要求曼哈顿距离和就一个点的横坐标维护一颗线段树,纵坐标维护一颗线段树,然后把曼哈顿计算柿子拆开,用线段树爆算即可。

这道题还在调。

F New Year and Conference

考虑二维数点,但是判断不合法十分的困难,所以我们给每个区间搞一个随机值,然后排完序后正反扫两边,去哈希,如果异或起来的值是 \(0\),那么就是可行的,错误率仅为 \(\frac{1}{2^ {31}}\),非常的好。

这道题有点不太懂。

感受

感觉心态有点小炸裂,特别是 A 题,调了一坤时都没调出来,最后发现是输入有问题,感觉要炸裂了啊,特别是因为总是要看题解才能写出代码,感觉写多了 DP 有点写不动数据结构,被 ChiFAN 嘲讽了,每次就是这样,一碰到题目想完后就看题解,看题解就想贺,贺完之后又很自责,感觉是个恶性循环,要改改了。

晚上想了一下原因,还是因为太紧张了,去年 CSP 失利后感觉热情有点低,今年 CSP 前要赶快调整状态,后天考试,感觉每次考试都很紧张,紧张就考不好,又是一个恶性循环。每次题目都有一点没想明白,不知道是正常现象还是不正常。

\(07.10\)

今天是数论专题。

题单

题目链接:Link

A Strange Limit

要求一个 \(p^{p^{p^{.^{.^{.^{p}}}}}} \bmod m!\),考虑使用扩展欧拉定理,定理内容为:\(a^b \equiv a^{b \bmod \varphi(p) + \varphi(p)} (\bmod p)\),然后我们递归求解直到 \(\varphi (p) = 1\) 为止,因为此时继续计算是没有意义的了。

小订正:如果上面 \(b < \varphi (p)\),那么有 \(a^b \equiv a^{b} (\bmod p)\),但是由于指数是无限的,肯定是大于等于 \(\varphi(p)\) 的。

B GCD Determinant

zyb 在网上搜了结论,这个结论说这个矩阵的行列式就是所有数的欧拉函数之积,然后由于值域很大,所以我们质因数分解爆算欧拉函数,再相乘就可以了。

这个结论有点不太懂。

E Remainders Game

我们发现针对一个数 \(x\),令 \(x \bmod c_i = d_i\),那么如果想要保持 \(d_i\) 不变,那么下一个 \(x'\) 就是 \(x + \text{lcm}(c_i)\),那么这个柿子就是 \(x + a\text{lcm}(c_i) \equiv x (\bmod k)\)(因为所有的 \(x \bmod k\) 的结果都要一样),所以只有当 \(k | \text{lcm}(c_i)\),才能有可能。注意爆算会炸掉,舍去无用的就可以了。

Power Tower

这个也是用扩展欧拉定理,只不过需要考虑两种情况而已。然后考虑证明这个递归是 \(\log_n\),用更相减损术证明 \(n > 2, 2|\varphi(n)\),然后就可以发现每次递归 \(\varphi (n)\) 的大小是折半的,就可以证明了。

G Master of Phi

首先你发现这个东西是狄利克雷卷积的一般形式,而且两个函数都是积性函数(第二个函数是单位函数),所以我们考虑求解,我们把 \(p, q\) 带进去,那么一组答案就是:

\[\sum_{1 \le i \le q} \varphi (p^i) \frac{n}{p^i} \]

然后伟大的 zyb 发现这个是个等比数列,由于欧拉函数是一个积性函数,所以 \(\varphi(p^i) \times \varphi(p) = \varphi (p^{i + 1})\),然后 \(\frac{\varphi(p)}{p}\) 就是上面那个柿子的比值,然后用公式就可以爆算了,注意最终结果是相乘不是相加。

感受

感觉还行,没有码量很大的题目。有些题思考也能想出来,总之稳住心态,面对明天的考试。上午的讲课过于牛逼,听懂了一半左右。反正数论这一块东西大家都可以优势互补,没有谁哪道题都会做。思考了一下昨天为什么会失利,原因是因为我打代码是一边打一边检查,速度很慢,久而久之就感觉很空虚,不过还好今天自己打出了昨天 D 题,算是找回了点颜面。

\(07.11\)

今天是 NOIP 模拟赛(保留了大部分的挂分,你才知道你考的是 NOIP)。

string

这个题很简单,你就从中间分类两次断开,然后用两个指针扫一下,只允许一次不同,最后判一下就好了,需要注意的是插入字符正好在中间的情况。

friends

考场上没太想,最主要的是可以搞成一个团,用并查集搞一下就可以了,没太打。细节比较多,好像机房没几个人 A。

多的东西就放云剪贴板里了:Link

dishes

差一点想到正解。

考虑一个事情,如果钦定 \(a\) 中选的个数与 \(b\) 中选的个数,那么下一个过程的时间一定是固定的,这也促使我们写出一个 \(O(n^2)\) 的 DP,然后我们发现我们可以将一个不等式给预处理出一部分,那么就是一个前缀和小于一个餐的时间的形式。

然后你发现是一个矩阵,把 DP 差分一下。

考场上想到这里就没想了,伟大的 zyb 爷爷告诉我可以用滚动数组优化掉一维,由于时间前缀和是单调的,所以我们使用线段树来维护一下,然后 zyb 爷爷就 A 了,十分的巨。

感觉有点不太懂,没写代码。

感受

最开始以为只有自己是 \(100\) 多分,结果成绩出来后大家都挂分了,chifan 口胡的两道题更是直接保龄,我这个分数甚至能排进前 \(10\),最后有点遗憾的就是 T2 有点没想,考试完后问一下万能的 zyb 爷爷,让他为我解疑答惑。

\(07.12\)

今天是图论。

题单

题目链接:Link

讲题摘要

  • 必须掌握 Tarjan。
  • 无向图的 dfs 树只会有连向祖先的非树边。
  • 如果求最小生成树边过多可以考虑删除无用边。
  • ......

D Connecting Cities

考虑分治建边,每次考虑取两边的极小值加上两边的值建边,这样边数最多是 \(O(n \log_2 n )\) 的,具体实现可以看代码。

E Tournament

容易发现将 \(k\) 个关系缩点后是一条链,最后一个节点的节点数就是答案,每次插入一个点,就把它和其他不能完全战胜它的点合并起来,这里使用 \(set\) 维护就好了。

G Gift

首先按照 \(a\) 排序,这样你就解决了一维的问题了,然后考虑将一条边加入最小生成树集合里的情况,分两种:

  • 加入后连接了一个新的点,此时可以直接连接。
  • 加入之后构成了一个环,此时找这个环上最大的那条边,把它删掉,这里可以暴力维护,具体参见代码,注意删完边后并查集的结构会改变。

然后就做完了。

感受

今天这个晚上,又是彻夜难眠。

我开始思考我学 OI 的意义所在,难道我就只能这样下去了吗?我有像当初那样的热爱吗?我感觉现在切掉一道题没有像以前那样激动,开心,反而是因为看题解的感慨,失望。

我觉得本质原因是写题目的时间变长了,感到很空虚,虚度了光阴,很无奈,所以我必须得问别人,看题解,照着写代码,这样是不好的,但是我很难改变我传统的观念。

我普及组一等奖之前没有想过要拿奖,但是今年提高组,我觉得是一个莫大的挑战,去年的失败已经让我感受到了危机,我不断变得更强,但只觉得内心更加空虚,今年会考什么样的题?考什么算法?谁也不知道。

和别人的对比越来越强,但是从未从自己发现自身的问题,该如何去前进?我觉得这是一个很好的问题。我们都是为了同一个目标,但是谁能走到最后?也许我现在不是思考这个问题的时候,但是我觉得今年的 CSP-S 前两道题必须得切掉,这也许是通过小问题解决大问题的唯一方式。乃至以后的各种大考,对我来说都是一种巨大的挑战。

也许我需要自信,相信自己永远是解决问题的最好方式。

码完这段字,我觉得 CSP 前几个月,需要前所未有的专注,舍弃掉那些无用的东西(比如题解,颓废),提高训练的效率,也许是提升实力的唯一方式。

\(07.13\)

考试日,保龄了,所以题目留到明天写。

\(07.14\)

大半天

上午去熊猫基地玩了玩,然后下午去打电动,zyb 爷爷和王文翰爷爷十分的强,搞到了好多娃娃。

lightning

这道题首先把式子列成一个 DP 式,发现这个式子有决策单调性(其实是因为 \(\sqrt a\) 的一些性质),在此不做说明。然后我们发现对于这个式子没有什么过好的解法,于是利用决策单调性进行分治,不难发现时间复杂度是 \(O(n \log_2 n)\) 的。

然后说一句,zyb 爷爷在考场用二分队列把本题切掉了,十分的强悍。

ski

说句实话,这道题比 lightning 简单。

我们考虑滑动一定是左右或者上下滑动最优的,并且可以分两种基本情况考虑:

  • 回弹,滑一次出去,再滑一次,就可以移动到相邻格子,可以以此类推。

  • 不回弹,弹一次后碰到墙壁,继续走。

然后我们可以根据这两个基本走法建边,不难发现最优路线一定不会走回头路,所以新建的冰块是没有影响的。注意边的数组要开大一点。

感受

今天 T3 调得有点疯了,感觉精神有点不太正常。

\(07.15\)

今天是 FSY 杂题分享。

题单

题目链接:Link

Lost Temple

虽然没 A,但是我要口胡。(据说 CCPC 这题没人过)

首先不难看出一个点被消掉的时间是走到外面的最短路,我们要求得正是一列中走向外面的最短路最长的点的距离是多少,容易发现相邻两列的答案最多差 \(1\),所以我们只需判断一个距离是否合法即可。

如果从一列走出的话,要不就是走上面,要不就是走下面,然后你发现这个东西是有一个上下界的,可以用单调队列直接扫一遍过去。

Horrible Cycles

我 c 这题真的好牛逼,刚开始题解都看不懂,硬生生磨了 \(1.5 hour\) 才磨出来。

首先我们把所有左部点插到 \(a_i\) 的右部点后面,顺序无所谓。然后我们发现一个很好的性质,就是所有左部点都连向上面的右部点。

然后我们可以设一个 DP 状态:\(f_{i, j}\),表示如果只取前 \(i\) 个点构成的链的数量,因为肯定会把环断成链。

然后我们考虑转移,如果这个点是右部点,那么与上面没有任何用,所以只能算自己本身是一条链,转移:

\[f_{i, j} = f_{i - 1, j} + f_{i - 1, j - 1} \]

然后如果这个点是左部点,那么这个点与上面所有右部点都有连边,会将上面的两条链合并为 \(1\) 条,这里需要思考一下,转移:

\[f_{i, j} = f_{i - 1, j} + f_{i - 1, j + 1} \times j(j + 1) \]

然后考虑答案,是将之前的一条链连起来合成一个环,需要思考,即为所有 \(f_{i - 1, 1}\) 的总和,然后我们再减去所有二元环的个数,由于链是有序的,所以减完后要除以 \(2\)

感受

感觉今天题很难,不知道是因为题太难还是我太菜,包括写的一道题都只搞懂 \(70%\),准备会长沙后问 Qiuly。

对于明天的考试,有几点要明确:

  • 尽力去做,暴力拿满。
  • 记得对拍,要大数据。
  • 不开 long long 见祖宗。
  • 调试代码记得删。

其实我觉得以上都是对于考试中要做的事情,真正是要做到心态平稳,自信面对考试,只要考试对你有收获,不论考得怎样,都是有益的。

\(07.16\)

今天上午 UNR,没考试,非常的 ****。学的是字符串。

题单

题目链接:Link

动物园

其中 \(num\) 数组就是不重叠的前后缀个数,考虑如何求出,我们可以不断套 \(next\),由于这个是最长的公共前后缀长度,所以跳到 \(< \frac{i}{2}\) 就可以计算了,但是这个做法是 \(O(n \log n)\) 的,所以非常的不优,考虑 \(next_i < i\),所以我们可以将指针一同跳,这样失配时跳的数量会大大减少,是 \(O(n)\) 的。

字符串的匹配

一道神仙题。

考虑我们要求排名,也就是要求相对位置相等,所以我们可以通过查找 \(b\) 的前驱后继来判断这一过程,然后就是模板 KMP,具体可以参考:Link

Sza-Template

这个题可以用失配树做,但用 DP 更简单。

考虑设 \(f_i\) 为到了前缀 \(i\) 最小的字符串长度,考虑这个东西可能为两个值,\(f_i\)\(f_{next_i}\),考虑什么时候可以到 \(next_i\),当然是后面的最长后缀与前面的最长前缀有重叠的时候就行了,用个桶记录一下。

Country

看 TJ 写的,感觉匡爷爷十分的有实力。

首先考虑暴力展开 \(KMP\),发现相同字母的 KMP 指针显然是可以互用的,所以考虑记忆化搜索,每次记录 \(f_{i, j}\) 为第 \(i\) 个字符之前处理的模式串匹配了 \(j\) 位的匹配次数,然后设一个 \(pos\) 表示 KMP 指针指到了哪里,然后如果是大写字母就递归,如果是小写字母就继续匹配 KMP,我觉得是非常正确的。

Substrings in a String

考虑用 bitset 搞一下。

存储每个字符出现在哪一位,然后查询时扫一遍,把连续 \(len\) 个字符的情况压进一个 bitset 里,然后查询有效区间里有多少个 \(1\) 就可以了。

感受

被 hhx 嘲讽了 ctj,感觉很爽(bushi。

感觉有点听不懂,怎么办呢?(凉拌

反正就是再接再厉,希望不看 TJ 写出题来。

\(07.17\)

感觉今天考试很人类智慧啊,T1 sb 智慧背包优化,T2 sb 神奇题目,T3 T4 md 黑题,结果一题没写,好像 T1 很简单?反正想骂人了。

jewel

感觉是一道很经典的题目了,要仔细写一写,在考场时很后悔没有学习单调队列优化多重背包。

首先如果这道题采用普通背包的方式去搞肯定是会 T 掉的,且复杂度类似于 NP 问题,不能再优化了,我们考虑从 \(1 \le c_i \le 300\) 入手解决,发现有很多物品的 \(c_i\) 是本质相同的,我们有发现一个经典结论:如果相同的 \(c_i\) 取得话,那么一定是选最大的一段,所以我们把相同的 \(c_i\) 排个序,然后搞出前缀和。发现转移就是下面这个柿子(\(f_i\) 表示恰好放了多少重量的最大价值):

\[f_j = \max(f_j, f_j - k \times c_i + sum(k, i)) \]

其中 \(sum\) 就是前缀和。根据多重背包的经验之谈,我们可以优化到下面这个转移:

\[f_{j \times c_i + z} = \max ( f_{j \times c_i + z}, f_{k \times c_i + z} + sum(j - k, i)) \]

你考虑 \(sum(p, i)\) 会随着 \(p\) 的增大,他的增长率是不升的,类似于一个凸包,然后我们可以推出,对于 \(j > k\),他们的决策点 \(pos_j \ge pos_k\) 的,这个可以盲猜一波。

然后我们通过 cdq 分治去处理这种决策单调性的 DP 问题,放一下代码:

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

using namespace std;

const int N = 1e6 + 5;
const int M = 305;

int n, k;
int w[N], tmp[N], dp[N], f[N];
vector < int > g[M];

struct Node {
    int c, v;
} a[N];

bool cmp ( int x, int y ) {
    return x > y;
}

void cdq ( int l, int r, int x, int y ) {
    if ( l > r ) {
        return ;
    }
    int mid = l + r >> 1;
    int maxi = -1, p = 0;
    for ( int i = x; i <= min ( y, mid ); i ++ ) {
        if ( maxi < tmp[i] + w[mid - i] ) {
            maxi = tmp[i] + w[mid - i];
            p = i;
        }
    }
    dp[mid] = maxi;
    cdq ( l, mid - 1, x, p ), cdq ( mid + 1, r, p, y );
}

signed main () {
    cin >> n >> k;
    for ( int i = 1; i <= n; i ++ ) {
        cin >> a[i].c >> a[i].v;
    }
    for ( int i = 1; i <= n; i ++ ) {
        g[a[i].c].push_back ( a[i].v );
    }
    for ( int i = 1; i <= 300; i ++ ) {
        sort ( g[i].begin (), g[i].end (), cmp );
    }
    for ( int i = 1; i <= 300; i ++ ) {
        if ( g[i].size () ) {
            for ( int j = 1; j * i <= k; j ++ ) {
                if ( j <= g[i].size () ) {
                    w[j] = w[j - 1] + g[i][j - 1];
                }
                else {
                    w[j] = w[j - 1];
                }
            }
            for ( int z = 0; z < i; z ++ ) {
                int cnt = 0;
                for ( int j = 0; j * i + z <= k; j ++ ) {
                    tmp[++ cnt] = f[j * i + z];
                }
                cdq ( 1, cnt, 1, cnt );
                for ( int j = 0; j * i + z <= k; j ++ ) {
                    f[j * i + z] = max ( f[j * i + z], dp[j + 1] );
                }
            }
        }
    }
    int maxi = -1;
    for ( int i = 1; i <= k; i ++ ) {
        maxi = max ( maxi, f[i] );
        cout << maxi << " ";
    }
    return 0;
}

trap

考虑以陷阱为根,然后考虑老鼠走的过程。

老鼠假如到了一个节点,那么一定最优方案一定是往下走后被逼着走上去,所以我们可以预处理出 \(f_i\) 表示以 \(i\) 为根的子树老鼠进去后再管理者采用最优方案的情况下,老鼠重新到 \(i\) 的步数。考虑管理者先行,所以一定是把最大的子树给堵掉,然后老鼠一定是走向第二大 \(f_v\),如果有两个最大的 \(f_v\),同样如此,可以模拟。

然后考虑进去后出来的贡献现在是非常好算的,老鼠一定会被堵到一个叶子节点内,此时会被它所走的路弄脏,所以我们只要把这个点到根节点的路径擦干净就好了,最优方案一定是把其他分支给堵起来。但是老鼠可以先向上走一段然后再进入子树等待收编,于是我们二分这个过程,去看是否路径上每个都行,然后就行了。

总之还是有一点不理解,懂?

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;

int n, t, m;
int f[N], g[N], fa[N];
bool vis[N];

int head[N], tot;

struct Graph {
    int to, next;
} edges[N << 1];

void add ( int u, int v ) {
    tot ++;
    edges[tot].to = v;
    edges[tot].next = head[u];
    head[u] = tot;
}

void dfs ( int x, int dad ) {
    int siz = 0, maxi1 = 0, maxi2 = 0;
    for ( int i = head[x]; i; i = edges[i].next ) {
        if ( edges[i].to != dad ) {
            siz ++;
        }
    }
    if ( x != t ) {
        g[x] = g[dad] + siz - 1 + ( x == m ); 
    }
    for ( int i = head[x]; i; i = edges[i].next ) {
        if ( edges[i].to != dad ) {
            dfs ( edges[i].to, x );
            if ( maxi1 < f[edges[i].to] ) {
                maxi2 = maxi1;
                maxi1 = f[edges[i].to];
            }
            else if ( maxi2 < f[edges[i].to] ) {
                maxi2 = f[edges[i].to];
            }
        }
    }
    f[x] = maxi2 + siz;
    fa[x] = dad;
}

bool Check ( int x ) {  // 这里有点没太懂,问问 Qiuly 吧
    int tmp = 1;  // 为什么要设 tmp?
    for ( int i = m; i != t; i = fa[i] ) {
        int cnt = 0;
        for ( int j = head[i]; j; j = edges[j].next ) {
            if ( !vis[edges[j].to] && f[edges[j].to] + g[i] > x ) {
                cnt ++;
                if ( !tmp ) {
                    return false;
                }
                tmp --;
            }
        }
        x -= cnt;
        tmp ++;
    }
    return x >= 0;
}

int main () {
    ios :: sync_with_stdio ( false );
    cin.tie ( 0 ), cout.tie ( 0 );
    cin >> n >> t >> m;
    for ( int i = 1; i < n; i ++ ) {
        int u, v;
        cin >> u >> v;
        add ( u, v ), add ( v, u );
    }
    dfs ( t, 0 );
    for ( int i = m; i; i = fa[i] ) {
        vis[i] = true;
    }
    int l = -1, r = 1e8;
    while ( l + 1 < r ) {
        int mid = l + r >> 1;
        if ( Check ( mid ) ) {
            r = mid; 
        }
        else {
            l = mid;
        }
    }
    cout << r;
    return 0;
}

joker

就是发现答案具有单调性,然后 CDQ 分治就好了,注意把删边变成加边操作。(调出来再写)

感受

感觉被各位大神踩爆了啊。在我妈和我自己(雾)的疯狂洗脑下,我竟然还保持着一个乐观的心态,真 tm 不知道怎么搞得。

jewel 感觉是一道很经典的一道题,要想想自己为什么没想出来。

然后就是考试为什么喜欢考 cdq 啊,虽然匡爷和 zyb 都说是普通分治,但是觉得应该是 cdq。同时也喜欢考 JOI 的题目,ChiFAN 怒切——只能评绿。

然后就是心态要好,不过今天后面三道题都是黑怎么搞啊!!!

\(07.18\)

今天 老 K 给我们讲课,好像没怎么听懂?

然后今天都是改考试题目,写到昨天的总结里了。

好像没有新建题单。

\(07.19\)

今天考试好他妈傻逼,考到一半电脑爆炸(多看了一眼),本来 T1 A 了,结果直接爆炸,结果考后一堆挂分,貌似靠前?

mirror

首先一眼最短路题。

我们对网格跑最短路,考虑一个空格有两种镜子选择,我们可以拆点(因为有两种路径)连边跑最短路,暴力建边。

现在我们考虑解决两个问题:

  1. 如果一个镜子被经过两次不同的路径怎么办。
  2. 如果一个镜子跑最短路发现同时属于两种镜子怎么办。

首先,以上两种情况都是不可能出现的。对于 \(1\) 来说,明显可以去掉这个镜子,这样会更优,而对于 \(2\) 来说,走同向路径明显是不优的。

match

貌似是一个很典的 Trick,和之前那道二分图 DP 那道题有异曲同工之妙。

考虑把牛和牛棚放在一起排序!这个想法是完全没有想到的,然后就可以设状态 \(f_{i, j, 0/1}\) 表示前 \(i\) 个元素,有 \(j\) 个待匹配的牛(也可以最终没匹配上),无/有不匹配上的奶牛,注意到这一维和 \(j\) 是本质没有影响的。

最终转移就不说了,看代码:

f[0][0][0] = 1;  // 最开始方案数为 1
for ( int i = 0; i < 2 * n; i ++ ) {
	if ( !a[i + 1].second ) {
		for ( int j = 0; j <= n; j ++ ) {
			f[i + 1][j + 1][0] += f[i][j][0];
			f[i + 1][j + 1][0] %= mod;
			f[i + 1][j][1] += f[i][j][0];
			f[i + 1][j][1] %= mod;
			f[i + 1][j + 1][1] += f[i][j][1];
			f[i + 1][j + 1][1] %= mod;
			f[i + 1][j][1] += f[i][j][1];
			f[i + 1][j][1] %= mod;
		}
	}
	else {
		for ( int j = 0; j <= n; j ++ ) {
			if ( j > 0 ) {
				f[i + 1][j - 1][0] += ( 1ll * ( 1ll * j * f[i][j][0] ) % mod );
				f[i + 1][j - 1][0] %= mod;
				f[i + 1][j - 1][1] += ( 1ll * ( 1ll * j * f[i][j][1] ) % mod );
				f[i + 1][j - 1][1] %= mod;
			}
			f[i + 1][j][0] += f[i][j][0];
			f[i + 1][j][0] %= mod;
		}
	}
}
cout << ( f[2 * n][0][0] + f[2 * n][0][1] ) % mod;

感受

这一天还挺行的,至少心态没崩。

然后评价 zyb 与 yjf 出的比赛,我之前踩过坑,所以我总是劝告:

yjf:

yjf:最近出了一道数据结构科技,打算出场比赛。
zyb:AC 自动机上淀粉质怎么样,Fail 树上 DP 怎么样。

感觉我说话语气挺好,情商不是很低,可以他们认为我很菜,认为我不配评价他们的题目,但是接受到的回应却是这样的:

yjf:我觉得我很清楚你的数据结构实力。
zyb:做不出就直说,不要话里套话。

在此不做评价,虽然我很弱,但是并不应该受到鄙视链的影响,这是一个 OIer 所具备的良好素质。我觉得 kcr 的态度就非常好,题目也更加高质量,更喜欢这种内敛,情商极高的人(并无对号入座)。

可以引用 Qiuly 对我说的一句话:

Qiuly:你们这个时候不要出比赛,专心刷题,没实力(无对号入座)还出题,图个啥?(指得不是我,我只能笑笑)

我不做评价,但是内涵一下 yjf 和 zyb,希望所有这种人都可以引起反思,并重视这种问题。

再评价关于 yjf 得到 UNR 银牌这种事,我只能笑笑,不做评价。

\(07.20\)

今天讲 DP 呢,做的题目都放在 DP 小结里了。

但是还是非常难得,毕竟是 zjk 给我们讲课,智商不在一个层次。

\(07.21\)

由于是最后一天,所以不会写什么东西,关键写一下对成都集训的总结。

总结

总之还是有收获的,从两个方面来谈的话就是:实力的提升和人缘的认知。

从实力的角度来谈,我做的题目更加困难了,感觉思维更加有深度了,这是我自己的感觉。但从别人的角度看,就可能不是这样子的了(请勿对号入座)。

从人缘的角度来说,让我认识了更多的高手,比如寝室里两位今年打 NOI 的选手就非常的强悍,但与此同时,我也发现了一些与人不友好相处的人,请勿对号入座。

PS:没有 PS。

虽然但是,在成都之行中也有很多不愉快的瞬间(请勿对号入座),比如喷原神之类的。 但我希望这次旅行能给我带来学 OI 的信心与前进的动力,与看清楚 OI 世界的广大!

posted @ 2023-07-15 17:17  Alexande  阅读(113)  评论(1)    收藏  举报