这次终于是早上考试了

早上考试手感不错,这次刷新了以前的最高排名~

%%%cyh巨佬 \(rk1\)

%%%CT巨佬 \(t2\) 90

纵观前几,似乎我 \(t3\) 是最低的……

总计挂分10分,\(t2\) 写的 \(exgcd\) 因为变量打错没用上


A. 最长不下降子序列

第一眼看上去没思路……

看见 \(n\) 的范围太大了,估计得从数列生成上做文章

一开始研究了半天二次函数之类的东西,试图寻找单调性之类的东东

后来索性不会还是打个表找规律吧

咦?居然循环了?

(这个样例给的刁钻呀)其实换个什么别的模数或者初始项很快就会出现循环节

冷静分析一下,因为模数很小,前一项经过函数作用后结果是固定的,那么最多出现模数个数后就会出现循环

那循环就简单了,有几个循环就有几个相等数,循环节内部也会有,把第一个拿出来和前面的跑个LIS拼一下完事儿

然后写个对拍,发现Wa了!!!

开始手模,发现有一种很神奇的情况,比如:

14523 14523 14523

乍一看前面是3加上后面两个是5,但其实是6

冷静分析一下发现这种情况只有把前 \(len\) 个循环节都揪出去跑才能解决

赶紧改一下然后就过了

代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e6+5;
int n,t[maxn],a,b,c,d,last[maxn],ed,num,len,st,st1,ans,f[maxn],cc[maxn];
void add(int x,int w){
x++;
for(;x<=151;x+=x&-x){
cc[x]=max(cc[x],w);
}
return ;
}
int ask(int x){
x++;
int ans=0;
for(;x;x-=x&-x)ans=max(ans,cc[x]);
return ans;
}
signed main(){
// freopen("lis0.in","r",stdin);
// freopen("my.out","w",stdout);
cin>>n;
cin>>t[1]>>a>>b>>c>>d;
if(n<=100000){
for(int i=2;i<=n;i++){
t[i]=(a*t[i-1]*t[i-1]+b*t[i-1]+c)%d;
}
for(int i=1;i<=n;i++){
f[i]=1;
f[i]=max(f[i],ask(t[i])+1);
add(t[i],f[i]);
ans=max(ans,f[i]);
}
cout<<ans;
return 0;
}
last[t[1]]=1;
for(int i=2;i<=n;i++){
t[i]=(a*t[i-1]*t[i-1]+b*t[i-1]+c)%d;
if(last[t[i]]){
st=last[t[i]];
len=i-last[t[i]];
break;
}
last[t[i]]=i;
}
for(int i=st+len;i<=st+len*(len+10);i++){
t[i]=(a*t[i-1]*t[i-1]+b*t[i-1]+c)%d;
}
num=(n-st+1)/len-len;
ed=n-num*len;
for(int i=1;i<=ed;i++){
f[i]=1;
f[i]=max(f[i],ask(t[i])+1);
add(t[i],f[i]);
}
st1=ed+1;
for(int i=st1;i<=st1+len-1;i++){
for(int j=1;j<=ed;j++){
if(t[j]<=t[i])ans=max(ans,f[j]);
}
}
cout<<ans+num;
return 0;
}

考完看题解,还有一种不同的方法

对于循环节的 LIS 采用 \(dp\) 的方式

设 \(f[n][i][j]\) 表示以第一个循环节 \(i\) 开头,以后面第 \(n\) 个循环节的 \(j\) 结尾的 LIS 长度,转移:

\[f[n][i][j]=\max_{1\le k \le T,a[i]\le a[k]\le a[j]}(f[n-1][i][k]+f[1][k][j])
\]

然后用了一个很神奇的方法优化一下——广义矩阵乘法

正常的矩乘是先乘后加,发现形式和这个很像,这不过这个是先加后 \(max\),只要把矩乘定义该一下就好了

把 \(F[1]\) 看成 \(base\) 矩阵,那么 \(F[n]=F[n-1]*base\),这样可以矩阵快速幂了

然后 \(F[1]\) 暴力算一下即可


B. 完全背包问题

考场上想过同余最短路,但是看见还有总和不超过 \(C\) 的限制条件就直接跑路了,然后转数学,开始裴蜀定理乱搞,搞不出来

正解就是同余最短路,但是得加个分层来满足限制条件

先来根据同余最短路的套路来设个方程:

\(f[j][k]\) 表示选了的物品模 \(val[0]\) 等于 \(j\),且选了 \(k\) 个物品的最小总价值(之所以是最小,因为最后要加许多个 \(val[0]\),最小的可以表示出全部状态)

转移:

\[f[j][k]+val[i]->f[(j+val[i])\%val[0]][k] (val[i]<L)
\]
\[f[j][k]+val[i]->f[(j+val[i])\%val[0]][k+1] (val[i]\ge L)
\]

发现如果点开成一维的不好转移,那么再加一维代表层数,转移即可

代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
const int maxn=55,maxm=10005;
int n,m,limit,sum,val[maxn],w,dis[maxm][maxn];
bool vis[maxm][maxn];
int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
struct Node{
pair<int,int>id;
int dis;
Node(){}
Node(pair<int,int>x,int y):id(x),dis(y){}
bool operator < (const Node & x)const{
return dis>x.dis;
}
};
priority_queue<Node>q;
void dij(){
memset(dis,0x3f,sizeof dis);
dis[0][0]=0;
q.push(Node(make_pair(0,0),0));
while(!q.empty()){
pair<int,int>x=q.top().id;
q.pop();
if(vis[x.fi][x.se])continue;
vis[x.fi][x.se]=true;
for(int i=2;i<=n;i++){
if(val[i]>=limit&&x.se==sum)break;
if(val[i]<limit){
if(dis[(x.fi+val[i])%val[1]][x.se]>dis[x.fi][x.se]+val[i]){
dis[(x.fi+val[i])%val[1]][x.se]=dis[x.fi][x.se]+val[i];
q.push(Node(make_pair((x.fi+val[i])%val[1],x.se),dis[(x.fi+val[i])%val[1]][x.se]));
}
}
else{
if(dis[(x.fi+val[i])%val[1]][x.se+1]>dis[x.fi][x.se]+val[i]){
dis[(x.fi+val[i])%val[1]][x.se+1]=dis[x.fi][x.se]+val[i];
q.push(Node(make_pair((x.fi+val[i])%val[1],x.se+1),dis[(x.fi+val[i])%val[1]][x.se+1]));
}
}
}
}
return ;
}
signed main(){
n=read();
m=read();
for(int i=1;i<=n;i++)val[i]=read();
sort(val+1,val+n+1);
limit=read();
sum=read();
dij();
for(int i=1;i<=m;i++){
w=read();
bool flag=false;
for(int j=0;j<=sum;j++){
if(w>=dis[w%val[1]][j]){
flag=true;
break;
}
}
if(flag)puts("Yes");
else puts("No");
}
return 0;
}

题解上介绍了复杂度更优的方法:


C. 最近公共祖先

每次修改一个点的时候,暴力跳 \(father\),这是祖先的权值对其他子树是有贡献的,在 \(dfs\) 上修改即可

由于每个节点只有第一次走到父亲是有用的,所以最多更新 \(n\) 次,复杂度正确

noip模拟29的更多相关文章

  1. noip模拟29[简单的板子题](虽然我不会)

    \(noip模拟29\;solutions\) 这次考试给我最大的伤害,让我意识到了差距 这场考试可以说是非常的简单,就是简单到,看两眼,打个表就有结果了 但是呢?我考得非常的完蛋,只有30pts 据 ...

  2. NOIP模拟 29

    T1第一眼觉得是网络流 看见4e6条边200次增广我犹豫了 O(n)都过不去的赶脚.. 可是除了网络流板子我还会什么呢 于是交了个智障的EK 还是用dijkstra跑的 居然有50分!$(RP--)$ ...

  3. NOIP 模拟29 B 侥幸

    这次考得好纯属是侥幸,我T3打表试数试了两个小时,没有想打T2的正解(其实是打不出来)所以这个T3A掉纯属是侥幸,以后还是要打正解 (以下博客最好按全选观看,鬼知道为啥这个样子!) 在这里也口胡一下我 ...

  4. Noip模拟29(瞎眼忌) 2021.8.3

    T1 最长不下降子序列 在此记录自己的瞎眼... 考场上像一个傻$der$,自己为了防范上升序列和不下降序列的不同特意的造了一组$hack$数据来卡自己:(第一行是序列长度,第二行是序列) 6 1 5 ...

  5. 2021.8.3考试总结[NOIP模拟29]

    T1 最长不下降子序列 数据范围$1e18$很不妙,但模数$d$只有$150$,考虑从这里突破. 计算的式子是个二次函数,结果只与上一个值有关,而模$d$情况下值最多只有$150$个,就证明序列会出现 ...

  6. NOIP 模拟 $29\; \rm 最近公共祖先$

    题解 \(by\;zj\varphi\) 首先考虑,如果将一个点修改成了黑点,那么它能够造成多少贡献. 它先会对自己的子树中的答案造成 \(w_x\) 的贡献. 考虑祖先时,它会对不包括自己的子树造成 ...

  7. NOIP 模拟 $29\; \rm 完全背包问题$

    题解 \(by\;zj\varphi\) 一道 \(\rm dp\) 题. 现将所有种类从小到大排序,然后判断,若最小的已经大于了 \(\rm l\),那么直接就是一个裸的完全背包,因为选的总数量有限 ...

  8. NOIP 模拟 $29\; \rm 最长不下降子序列$

    题解 \(by\;zj\varphi\) 观察这个序列,发现模数很小,所以它的循环节很小. 那么可以直接在循环节上做最长上升子序列,但是循环节中的逆序对会对拼接后的答案造成影响. 没有必要找逆序对个数 ...

  9. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

随机推荐

  1. Apache Flink jobmanager/logs路径遍历CVE-2020-17519

    影响版本 1.11.0 1.11.1 1.11.2 poc http://192.168.49.2:8081/jobmanager/logs/..%252f..%252f..%252f..%252f. ...

  2. root密码找回

    1,启动系统时,按上下键,选择第一项,按e. 2,编辑kernel中,将rhgb quiet 替换作init=/bin/sh.回车确认修改 3,根据提示按b键继续启动. 4,进入bash窗口并有管理员 ...

  3. 论文笔记:(ICCV2019)KPConv: Flexible and Deformable Convolution for Point Clouds

    目录 摘要 一.引言 二.相关工作 投影网络 图卷积网络 逐点多层感知器网络 点卷积网络 三.核点卷积 3.1由点定义的核函数 3.2刚性的或可变形的核 3.3核点网络层 3.4核点网络架构 四.实验 ...

  4. 面试官:展开说说,Spring中Bean对象是如何通过注解注入的?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 章节目录(手写Spring,让你了解更多) [x] 第 01 章:开篇介绍,我要带你撸 Spr ...

  5. 15 道超经典大厂 Java 面试题!重中之重

    从超高频的后端面试题出发,指明学习方向 大家好,我是鱼皮. 还记得我的老弟小阿巴么?他目前正值大一暑假,在家自学编程(刷短视频)中. 他整个大一期间基本都在学习前端.后来,我带他写了一次后端,结果就崩 ...

  6. LiteFlow 2.6.0版本发行注记,项目逻辑解耦的利器

    前言 自从LiteFlow 2.5.X版本发布依赖,陆续经历了10个小版本的迭代.社区群也稳固增长,每天都有很多小伙伴在问我问题. 但是我发现最多人问我的还是:什么时候能支持界面编排? 从LiteFL ...

  7. Windows10公钥远程连接Linux服务器

    目录 前言 一.环境准备 二.使用步骤 1.服务器安装并配置OpenSSH 2. 本地生成密钥 3. 服务器ssh添加密钥 三 总结 前言 使用公钥远程登陆Linux十分方便,无需输入密码,同时采用V ...

  8. 博客CSS样式 二

    预览 可自行更改颜色 背景图 页面定制 CSS 代码中加入: url为背景图地址,可下载心仪背景图后上传到博客园相册后获取地址 body { color: #000; background: url( ...

  9. 生成二维码项目pom.xml中QRCode依赖报错

    pom.xml报错如下: 解决方法: 1.将QRCode.jar包下载到E盘下 网盘下载地址: 链接:https://pan.baidu.com/s/1sY1NK5ekCkNH0uqraZMnKw 提 ...

  10. stm32高级定时器1互补输出 验证代码

    GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDe ...