【学习笔记】NOIP爆零赛7

结论专场,结果被踩暴了

青鱼和序列

赛时的做法是,维护 ∑ a i × i \sum a_i\times i ai×i的取值,发现只和最后一次操作 2 2 2的位置有关,于是递推 O ( n ) O(n) O(n)解决。

赛后发现还有更神奇的结论 第二个结论是,第一次进行操作 2 2 2过后, a a a序列变成回文的了,所以这之后 1 , 2 1,2 1,2操作就是等价的了。

这两个结论单独来看都很容易发现。不过接下来这个结论可能不容易看出:只要进行了操作 2 2 2,那么最后的结果就是一定的。事实上这不难从前 2 2 2个结论中看出。不过如果打表还是很容易看出的

看来我猜结论的功底还是太菜了,还是要多尝试啊

青鱼和怪兽

猜了一个结论,直接二分答案就可以解决。

同样不难通过打表证明这个结论是正确的

青鱼和区间

垃圾题解写的像shit一样,真就谜语人呗

这个结论太小,以至于我看不见

这道题的思维量还是非常高的,不过 n k nk nk这波玄学过题确实佩服。。。

我是joker,以为这道题转移比较难想,最后发现我连计数的对象都没搞清楚

如果不先入为主而是尝试推一下结论的话这道题还是可以分析的吧,但是最后那一步凭考场上的我是无论如何也推不出来的

首先最直白的翻译是,设 S i S_i Si表示覆盖 i i i位置的区间的集合,那么合法的条件等价于 S i S_i Si互不相同。

然后有一个结论:不存在 i 1 < i 2 < j 1 < j 2 i_1<i_2<j_1<j_2 i1<i2<j1<j2,使得 S i 1 = S j 1 ≠ S i 2 = S j 2 S_{i_1}=S_{j_1}\ne S_{i_2}=S_{j_2} Si1=Sj1=Si2=Sj2

这个结论的正确性其实挺显然的,但是当时我没往这方面想,而是直接去刚 d p dp dp了,现在想来确实是不明智的行为

那么我们把相同等价类的位置提出来,记作区间 [ l i : r i ] [l_i:r_i] [li:ri],那么这些区间要么包含要么不相交,这个结构就非常显而易见了:我们可以把原序列划分成若干个连续段,同时不存在两个不属于同一个连续段的 i , j i,j i,j使得 S i = S j S_i=S_j Si=Sj。这个性质也等价于什么呢,对于询问区间 [ i : j ] [i:j] [i:j],要么 i , j i,j i,j在同一段中,要么 [ i : j ] [i:j] [i:j]不能制造断点,也就是说 [ i : j ] [i:j] [i:j]恰好是若干完整的段拼起来的。

现在我们只差最后一步:如何对这些若干不相交的 [ l i : r i ] [l_i:r_i] [li:ri]计数?

我竟就倒在了这里。。。

考虑一个普通至极的思路:正难则反。也就是说,我们减去分出来的段数 < n <n <n的方案数。那么我们考虑,假设分成了 j j j段,根据前面的观察,我们要把这分出来的 j j j段区分出来,然后对于长度为 l l l的一段,我们需要注意端点是不能包括在区间中的,因此有 ( l − 2 ) ( l − 1 ) 2 \frac{(l-2)(l-1)}{2} 2(l2)(l1)个可选择的区间,方案数为 2 ( l − 2 ) ( l − 1 ) 2 2^{\frac{(l-2)(l-1)}{2}} 22(l2)(l1)

有了上述动机,我们设 d p i dp_i dpi表示长度为 i i i的答案,有转移式: d p i = 2 i ( i + 1 ) 2 − ∑ j < i d p j f i , j dp_i=2^{\frac{i(i+1)}{2}}-\sum_{j<i}dp_jf_{i,j} dpi=22i(i+1)j<idpjfi,j,其中 f i , j f_{i,j} fi,j表示把 i i i分成 j j j段的所有方案的系数和。

复杂度 O ( n 3 ) O(n^3) O(n3)可以用多项式工业优化到 O ( n poly ( n ) ) O(n\text{poly}(n)) O(npoly(n)),但是有点复杂并且我不太懂所以就咕了

这就是天才和凡人的差距吗

#include<bits/stdc++.h> #define inf 0x3f3f3f3f #define ll long long #define pb push_back #define fi first #define se second using namespace std; const int N=305; int n,mod; ll pw[N*N],dp[N][N],res[N]; void add(ll &x,ll y){ x=(x+y)%mod; } int main(){ cin>>n>>mod; pw[0]=1;for(int i=1;i<=n*n;i++)pw[i]=pw[i-1]*2%mod; dp[0][0]=1; for(int i=0;i<n;i++){ for(int j=0;j<=i;j++){ if(dp[i][j]){ for(int k=1;k<=n-i;k++){ add(dp[i+k][j+1],dp[i][j]*pw[(k-1)*(k-2)/2]); } } } } for(int i=1;i<=n;i++){ res[i]=pw[i*(i+1)/2]; for(int j=1;j<i;j++){ res[i]=(res[i]-res[j]*dp[i][j])%mod; } }cout<<(res[n]+mod)%mod; }

青鱼和游戏

考场上爆蛋了

这题爆蛋有两个原因:一是确实不会做,二是 t 3 t3 t3确实被卡住了

说白了就是太菜了


__EOF__

本文作者仰望星空的蚂蚁
本文链接https://www.cnblogs.com/cqbzly/p/17530022.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   仰望星空的蚂蚁  阅读(14)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示