NOIP2025模拟赛24
T1 | T2 | T3 | T4 |
---|---|---|---|
\(\color{#52C41A} 普及+/提高\) | \(\color{#3498DB} 提高+/省选-\) | \(\color{#9D3DCF} 省选/NOI-\) | \(\color{#0E1D69} NOI/NOI+\) |
参赛网址:https://oj.33dai.cn/d/TYOI/contest/689ad798c5d9c2f14c20b17f
T2,T4未完成搭建
T1 寄希地【NOIP2025模拟赛T1】
题目难度:\(\color{#52C41A} 普及+/提高\)
算法标签:搜索,搜索与剪枝
~首先说 《我将 100 AC 改为 0 RE 这件事》!~
:::info[来源]
来源:2024ICPC亚洲区域赛昆明站G
cf链接:https://codeforces.com/gym/105588/problem/G
2024ICPC亚洲区域赛昆明站G题面:https://codeforces.com/gym/105588/attachments/download/28814/2-statement-chinese.pdf
2024ICPC亚洲区域赛昆明站G题解:https://codeforces.com/gym/105588/attachments/download/28803/tutorial.pdf
:::
思路
由于具有明显提示性,本题没有大样例。
首先考虑打表,通过 \(\text {Dp}\) 或搜索。
然后我们发现答案在 \(17\) 以内,搜索时间复杂度 \(O(2^{17})\) ,结案。
复杂度的证明
设两数分别为 \(x\),\(y\)。
-
情况1:\(x\) 和 \(y\) 奇偶性不同,
\(\because\) \(x\) 和 \(y\) 奇偶性不同.
\(\therefore\) \(\gcd(x,y) \equiv 1 \pmod{2}\).
设 \(x \equiv 1 \pmod{2}\).
则如果使 \(x-\gcd(x,y)\).
那么 \(x\) 和 \(y\) 在二进制下末尾都为 \(0\),即 \(x \equiv y \equiv 0 \pmod{2}\),我们可以视为 同时删除 \(x\) 和 \(y\) 的末尾.
-
情况2:\(x\) 和 \(y\) 奇偶性相同,
\(\because\) \(x\) 和 \(y\) 奇偶性相同.
\(\therefore\) \(\gcd(x,y) \equiv 0 \pmod{2}\).
那么 \(x\) 和 \(y\) 在二进制下末尾都为 \(0\),即 \(x \equiv y \equiv 0 \pmod{2}\),同时删除 \(x\) 和 \(y\) 的末尾对答案相当于 \(+2\).
所以答案最大为 \(2 \times log_2 a+1+1\).
AC Code
std:2ms
#include <bits/stdc++.h>
#define int long long
using namespace std;
int T;
int n,m;
struct node{int n,m,dis;};
queue<node> Q;
int bfs(){
while (Q.size()>0) Q.pop();
Q.push({n,m,0});
while (Q.size()>0){
node t=Q.front();Q.pop();
int x=t.n,y=t.m;
if (x==0&&y==0) return t.dis;
int gcd=__gcd(x,y);
if (x==0) gcd=y;
if (y==0) gcd=x;
Q.push({x-gcd,y,t.dis+1});
Q.push({x,y-gcd,t.dis+1});
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>T;
while (T--){
cin>>n>>m;
cout<<bfs()<<"\n";
}
return 0;
}
T2 后缀的前缀之和【NOIP2025模拟赛T2】
题目难度:\(\color{#3498DB} 提高+/省选-\)
算法标签:字符串,Trie树,后缀数据结构,数据结构,Hashing,其他,二分查找,分治
T3 大金币【NOIP2025模拟赛T3】
题目难度:\(\color{#9D3DCF} 省选/NOI-\)
算法标签:模拟,递推,其他,二分查找,数学,分块
:::info[来源]
来源:2024ICPC亚洲区域赛昆明站C
cf链接:https://codeforces.com/gym/105588/problem/C
2024ICPC亚洲区域赛昆明站题面:https://codeforces.com/gym/105588/attachments/download/28814/2-statement-chinese.pdf
2024ICPC亚洲区域赛昆明站题解:https://codeforces.com/gym/105588/attachments/download/28803/tutorial.pdf
:::
思路
https://oj.33dai.cn/d/TYOI/p/N0740/solution
考虑第 \(i\) 轮淘汰的第一个人,\(a_i=\lceil \frac{a_{i-1}\times k}{k-1} \rceil\)。
可以通过打表得知,为什么我没发现。
直接暴力太慢了,时间复杂度 \(O(n)\)。
\(a_i=\lceil \frac{a_{i-1}\times k}{k-1} \rceil=a_{i-1}+\lceil \frac{a_{i-1}}{k-1} \rceil\)
所以可以每次考虑增量 \(c=\lceil \frac{a_{i-1}}{k-1} \rceil\)。
二分即可。
AC Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e7+5;
int T;
int n,k;
int dp[maxn];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>T;
while (T--){
cin>>n>>k;
dp[1]=1;
int x=1,num=0,d=0;
while (1){
d=(x+k-2)/(k-1);
int l=0,r=(n-x+d)/d,ans=0;
while (l<=r){
int mid=(l+r)>>1;
if ((x+mid*d+k-2)/(k-1)<=d){
l=mid+1;
ans=mid;
}
else r=mid-1;
}
num=ans+1;
if (x+num*d>=n){
x+=((n-x)/d)*d;
break;
}
x+=num*d;
}
cout<<x<<"\n";
}
return 0;
}
T4 道路定向【NOIP2025模拟赛T4】
题目难度:\(\color{#0E1D69} NOI/NOI+\)
算法标签:贪心,搜索,折半搜索,动态规划,树形DP