当前位置: 首页 > news >正文

【学习笔记】NOIP爆零赛7

结论专场,结果被踩暴了

青鱼和序列

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

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

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

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

青鱼和怪兽

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

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

青鱼和区间

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

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

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

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

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

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

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

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

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

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

我竟就倒在了这里。。。

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

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

复杂度O(n3)O(n^3)O(n3)可以用多项式工业优化到O(npoly(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;
}

青鱼和游戏

考场上爆蛋了

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

说白了就是太菜了

http://www.lryc.cn/news/22541.html

相关文章:

  • 一文读懂账号体系产品设计
  • 从“入门”到“专家”,一份3000字完整的性能测试体系的知识分享
  • 构建对话机器人:Rasa3安装和基础入门
  • Spark计算框架入门笔记
  • 入职数据分析公认的好书|建议收藏
  • Linux查找文件和目录,重定向输出 ,系统默认运行级别的查看和设置理论和练习
  • Redis源码---键值对中字符串的实现,用char*还是结构体
  • 算法 - 剑指Offer 表示数值的字符串
  • 初识机器学习
  • VsCode安装PlatformIO 开发ESP arduino,买的板子或者随便ESP,PlatformIO添加Board(不是自定义Board)
  • golang 复杂数据结构解析
  • 不怕被AirTag跟踪?苹果Find My技术越来越普及
  • Linux驱动中的open函数是如何从软件打通硬件呢?
  • Java 基础语法
  • python下如何安装并使用matplotlib(画图模块)
  • 系统分析师---计算机网络思维导图
  • 算法练习(七)数据分类处理
  • nohup ./startWebLogic.sh >out.log 2>1 解析
  • OpenCV 坡度计算(基于DEM,C++版本)
  • IDEA上使用git,知道这几步操作就够了!
  • Shell的退出状态(if语句判断的是某个命令的退出状态)
  • Scala面向对象
  • LLaMA-META发布单卡就能跑的大模型
  • 第一篇自我介绍(单片机)
  • Tik Tok品牌营销,如何做好内容打法
  • 2023年5月软考软件设计师备考经验
  • SpringBoot 2.x ——使用 mail 实现邮件发送
  • 项目结束先别着急庆祝,项目经理还有这些事要做
  • 没想到的 IIFE
  • 「牛客网C」初学者入门训练BC156