[题解](更新中)2024/11/14 模拟赛 A~B

news/2024/11/15 7:07:58/文章来源:https://www.cnblogs.com/Sinktank/p/18546186

汉诺塔(hanoi)

题面是在说,你可以用两只手作为临时存储来玩汉诺塔,当且仅当拿起一个圆盘时,操作次数\(+1\)

我们不妨将盘子两两分组,组内盘子看作一个大盘子,拿起它的花费是\(+2\),然后根据\(n\)的奇偶性来讨论(\(f(i)\)表示\(i\)盘经典汉诺塔问题的答案):

  • \(n\)是偶数:转化成了\(\frac{n}{2}\)盘经典汉诺塔问题,答案即为\(f(\frac{n}{2})\times 2\)
  • \(n\)是奇数:相当于\(\lfloor\frac{n}{2}\rfloor\)个大盘子和\(1\)个小盘子,所以最终花费还要额外减去小盘子的移动次数,不难发现\(n\)盘经典汉诺塔问题,最顶上的盘子移动次数是\(2^{n-1}\),故答案就是\(f(\lceil\frac{n}{2}\rceil)\times 2-2^{\lfloor\frac{n}{2}\rfloor}\)

经典汉诺塔答案递推公式:\(f(i)=2\times f(i-1)+1\)。递推需要用矩阵加速(或者利用等比数列也可以)。

矩阵加速写法的时间复杂度是\(O(2^3\log n)\)

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define mod 998244353
using namespace std;
int n,base[2][2]{2,0,1,1},a[2][2],tmp[2][2];
void multi(int ans[2][2],int a[2][2],int b[2][2]){ans[0][0]=(a[0][0]*b[0][0]+a[0][1]*b[1][0])%mod;ans[0][1]=(a[0][0]*b[0][1]+a[0][1]*b[1][1])%mod;ans[1][0]=(a[1][0]*b[0][0]+a[1][1]*b[1][0])%mod;ans[1][1]=(a[1][0]*b[0][1]+a[1][1]*b[1][1])%mod;
}
void qpow(int b){while(b){if(b&1) multi(a,a,base);tmp[0][0]=base[0][0],tmp[0][1]=base[0][1],tmp[1][0]=base[1][0],tmp[1][1]=base[1][1];multi(base,tmp,tmp),b>>=1;}
}
int qpow(int a,int b){int ans=1;while(b){if(b&1) ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;
}
int f(int x){a[0][0]=0,a[0][1]=1;qpow(x);return a[0][0]; 
}
signed main(){cin>>n;if(n&1) cout<<(f(n/2+1)*2-qpow(2,n/2)+mod)%mod;else cout<<f(n/2)*2%mod;return 0;
}

与之国(and)

原题:P7970 [KSN2021] Binary Sea。

一开始的想法是将给定矩形剖成若干个小长方形,具体来说如下图。

首先按照“对齐最近的\(2\)的整数次幂行&列”,对行和列进行分割,如蓝线所示,其实就和树状数组一样,每次\(x\leftarrow (x+\text{lowbit}(x))\)。这样我们分割出来的每个矩形都可以正好被剖成若干大小相同的正方形,且每个正方形都是对齐到它的尺寸的。

之所以这么思考是因为我一直以为每个矩形都是一个连通块,这样剖分后就容易考虑了,只需要判断右上角和左下角是不是陆地,即可判定它是否和右边、下边连通了。

如果这种方法可行,时间复杂度将是每个询问\(O(n\log^2 n)\),因为剖分成的行数和列数都是\(O(\log n)\)的。这样算来其实和暴力差不了多少了(

最关键的是上面那个结论不对,这个看图就能看出来,所以说做法假掉了。不过还是把代码放上来吧,位运算那块写的感觉还不错。

点击查看假掉的代码
#include<bits/stdc++.h>
using namespace std;
int n,ax,ay,bx,by;
int Px[80],Py[80],idxx,idxy;
bool bot[80][80],rig[80][80],vis[80][80];
inline int lowbit(int x){return x&-x;}
void dfs(int x,int y){if(x>idxx||y>idxy||vis[x][y]) return;vis[x][y]=1;if(bot[x][y]) dfs(x+1,y);if(rig[x][y]) dfs(x,y+1);
}
signed main(){cin>>n;while(n--){cin>>ax>>ay>>bx>>by;int tax=ax,tay=ay;idxx=idxy=0;if(tax) while(tax+lowbit(tax)<=bx+1) Px[++idxx]=lowbit(tax),tax+=lowbit(tax);if(tay) while(tay+lowbit(tay)<=by+1) Py[++idxy]=lowbit(tay),tay+=lowbit(tay);for(int i=29;~i;i--) if(tax+(1<<i)<=bx+1) tax+=(1<<i),Px[++idxx]=(1<<i);for(int i=29;~i;i--) if(tay+(1<<i)<=by+1) tay+=(1<<i),Py[++idxy]=(1<<i);Px[0]=ax,Py[0]=ay;for(int i=1;i<=idxx;i++) Px[i]+=Px[i-1];for(int i=1;i<=idxy;i++) Py[i]+=Py[i-1];for(int i=1;i<=idxx;i++){for(int j=1;j<=idxy;j++){if(!(Px[i-1]&(Py[j]-1))) rig[i][j]=1;if(!((Px[i]-1)&Py[j-1])) bot[i][j]=1;}}int cnt=0;for(int i=1;i<=idxx;i++){for(int j=1;j<=idxy;j++){if((rig[i][j]||bot[i][j])&&!vis[i][j]) dfs(i,j),cnt++;}}cout<<cnt<<"\n";}return 0;
}

这道题的正解,需要从另一个角度思考。

如图,如果把节点和自己右边和下边的节点(如果有)进行连边操作,整个图就是一棵二叉树。我们不难发现,每次询问的答案就是矩形左边缘和上边缘上边的条数之和。

拿上边缘\(top\)举例(左边缘同理),答案就是:

\[\sum\limits_{i=left}^{right}[i\text{ and }x=0][i\text{ and }(x-1)=0]\\ \iff \sum\limits_{i=left}^{right}[i\text{ and }(x\text{ or }(x-1))=0]\]

用前缀和的思想转化成两个\(\sum\)相减,然后用数位dp求解就好了~

顺带为自己之前写的数位dp随笔打个广告:上篇、下篇

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ax,ay,bx,by,f[30],A,B;//A为限制,B为要参与求解的数 
int dfs(int pos,bool limit){//pos从30到1 if(!pos) return 1;if(!limit&&f[pos]) return f[pos];int rig=limit?((A>>(pos-1))&1):1,ans=0;for(int i=0;i<=rig;i++){if((B>>(pos-1))&i&1) continue;ans+=dfs(pos-1,limit&&i==rig);}if(!limit) f[pos]=ans;return ans;
}
int solve(int x,int l,int r){memset(f,0,sizeof f);int ans1,ans2;B=x,A=r,ans1=dfs(30,1);A=l-1,ans2=l?dfs(30,1):0;return ans1-ans2;
}
signed main(){ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);cin>>n;while(n--){cin>>ax>>ay>>bx>>by;if(!ax&&!ay) cout<<"1\n";else cout<<(bool)ax*solve(ax|(ax-1),ay,by)+(bool)ay*solve(ay|(ay-1),ax,bx)<<"\n";}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833828.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何彻底禁止 macOS Sonoma 自动更新,去除更新标记和通知

如何彻底禁止 macOS Sonoma 自动更新,去除更新标记和通知如何彻底禁止 macOS Sonoma 自动更新,去除更新标记和通知 请访问原文链接:https://sysin.org/blog/disable-macos-update/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org本文与 macOS Ventura 操作基本…

pycharm改变语法错误的颜色

在PyCharm的默认颜色中,如果方法名称写错了或变量名称写错了,文字下会有淡黄色波浪线,右侧滚动条也是黄色的,根本看不清楚。 经过一番搜索,发现这个贴子:https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000597704/comments/11745417961874 you can…

超越图像超分辨率的任务驱动感知损失图像识别

超越图像超分辨率的任务驱动感知损失图像识别在实际场景中,由于低分辨率(LR)内容中缺乏可用信息,图像识别任务(如语义分割和对象检测)通常会带来更大的挑战。图像超分辨率(SR)是解决这些挑战的有前景的解决方案之一。然而,由于SR的病态特性,典型的SR方法很难恢复与任…

4D医学图像的无中间帧数据高效无监督插值

4D医学图像的无中间帧数据高效无监督插值4D医学图像代表具有时间信息的3D图像,在临床实践中对于捕捉动态变化和监测长期疾病进展至关重要。然而,由于辐射暴露和成像持续时间等因素,获取4D医学图像带来了挑战,需要在实现高时间分辨率和最小化不利影响之间取得平衡。鉴于这些…

Windows 直接访问 WSL2 路径并直接进行读写操作,权限不足解决方法

https://blog.csdn.net/qq_33412312/article/details/119720052 https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config

一文搞懂 ARM 64 系列: ADD(立即数版)

一文搞懂 ARM 64 系列: ADD(立即数版)汇编中,加法指令很重要,因为它是执行其他很多指令的基础。 同时,加法指令也会影响NZCV标志。有关NZCV的介绍,可以参看《一文搞懂 ARM 64 系列: ADC》。 ARM64汇编中,ADD指令有3种形式,这里介绍第一种形式,也就是与立即数相加。 1 指…

Win10通过安装包安装Apple Music

打开Windows的开发者模式下载应用安装包 打开 https://store.rg-adguard.net用 URL 来搜索,只需要在 https://www.microsoft.com/zh-cn/store/ 找到你要安装的应用,然后复制 URL 即可在URL(Link)中输入https://apps.microsoft.com/store/detail/apple-music-preview/9PFHDD62…

01转二维码(不是二进制)

例题ctfhub/隐写v2.0打开是一张图片文件分离得到zip,爆破密码得到7878 打开得到0和1, !!!不是二进制转图片,直接是二维码 缩小能看到000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000…

LIS系统与仪器进行通信-软件

上一篇文章介绍了LIS系统与仪器进行通信的方式和协议。这篇文章主要介绍一下按照通信方式和协议开发的一个通信软件。 这个软件在LIS信息传输中充当一个中间者的角色,只负责在仪器和三方系统中传递消息。仪器、通信软件、三方系统三者之间的通信流程如下图:登录界面首页首页可…

iman——冲刺日志(第三天)

阉割版 团队成员分工与进度 📝👥组别 成员 完成的任务 完成任务所用时间 (小时) 剩余时间 (小时)前端 阿依娜孜 完成总览页面行程概览与高德地图接入,实现动态地图显示效果。 2 2前端 郭剑敏 优化并完善路线编辑功能的前端代码。 2 1前端 王梓铭 优化主页和导航栏布局,提…

雷电9安卓模拟器安装Xposed环境

参考:抹机王-雷电9-EdXposed框架安装 资源包:点击下载 备用链接 部署雷电9 开启雷电9的root权限修改模拟器磁盘共享方式为System.vmdk可写入安装Magisk 从资源包安装Magisk Delta.apk打开Magisk Delta,在 Magisk 那一栏点击安装下一步安装至系统分区注意:如果在该步骤没有出…

基于gossip流言算法实现alertmanager高可用

目录一.alertmanager高可用架构设计1 Gossip流言算法协议原理分析2 Gossip的优劣势3 Gossip中通信模式二.搭建alertmanager高可用架构实战1.搭建alertmanager高可用架构2..测试高可用 一.alertmanager高可用架构设计 1 Gossip流言算法协议原理分析如上图所示,我们可以发现aler…