欢迎光临
我们一直在努力

【寒假集训】2026.2.22

做题代码:

T1:T725277 【2026寒假集训】爱与和平

本题刚开始得了10分,代码为:

#include <bits/stdc++.h>
using namespace std;
bool huzhi(int x,int y){
if(__gcd(x,y)){
return true;
}
return false;
}
int a[100005];
int main() {
int n,sum=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
if(huzhi(a[i],a[i+1])){
continue;
}
else sum++;
}
cout<<sum;
return 0;
}

后来,改成了30分,代码为:

#include <bits/stdc++.h>
using namespace std;
bool huzhi(long long x,long long y){
if(__gcd(x,y)){
return true;
}
return false;
}
long long a[100005];
int main() {
long long n,sum=0;
cin>>n;
for(long long i=1;i<=n;i++){
cin>>a[i];
}
for(long long i=1;i<n;i++){
if(huzhi(a[i],a[i+1])){
sum++;
}
else continue;
}
cout<<sum;
return 0;
}

然后……总算AC了,代码为:

#include <bits/stdc++.h>
using namespace std;
bool huzhi(long long x,long long y){
if(__gcd(x,y)>1){
return true;
}
return false;
}
long long a[100005];
int main() {
long long n,sum=0;
cin>>n;
for(long long i=1;i<=n;i++){
cin>>a[i];
}
for(long long i=1;i<n;i++){
if(huzhi(a[i],a[i+1])){
sum++;
}
else continue;
}
cout<<sum;

return 0;
}

T2:T725282 【2026寒假集训】相遇时间

刚开始0分,代码我就不发了。

后来,整了个40分,代码为:

#include <bits/stdc++.h>
using namespace std;
int main() {
int a,b,c,d,sum=0;
cin>>a>>b>>c>>d;
if(a-c>=0){
sum+=(a-c);
}
else{
sum+=(c-a);
}
if(b-d>=0){
sum+=(b-d);
}
else{
sum+=(d-b);
}
cout<<sum/2;
return 0;
}

然后就是AC代码:

#include <bits/stdc++.h>
using namespace std;
int main() {
long long a,b,c,d,sum=0;
cin>>a>>b>>c>>d;
cout<<max(((abs(a-c)+1)/2),((abs(b-d)+1)/2));
return 0;
}

很简单,对吧,我也觉得,但为什么第三行憋不出来呢?

T3:T725285 【2026寒假集训】相等序列

刚开始:没做。

比赛后:两遍过:

①:80分:

#include <bits/stdc++.h>
using namespace std;

int a[1000005];
long long s[1000005];

int main() {
long long n, x,y,aa,sum=1e18;
cin >> n >> x>>y;
long long minn = 1e18;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
s[1]=1;
for(int i=1; i<=n; i++) s[i] = s[i-1] + a[i];
for (int i = 1; i <= n; i++) {
s[i] = x * i * a[i] – x * s[i] + y*(s[n] – s[i]) – y*(n – i) * a[i];
sum=min(sum,s[i]);
}
cout<<sum;
return 0;
}

②:全AC:

#include <bits/stdc++.h>
using namespace std;

int a[1000005];
long long s[1000005];

int main() {
long long n, x,y,aa,sum=1e18;
cin >> n >> x>>y;
long long minn = 1e18;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a+1,a+n+1);
s[1]=1;
for(int i=1; i<=n; i++) s[i] = s[i-1] + a[i];
for (int i = 1; i <= n; i++) {
s[i] = x * i * a[i] – x * s[i] + y*(s[n] – s[i]) – y*(n – i) * a[i];
sum=min(sum,s[i]);
}
cout<<sum;
return 0;
}

T4:T725286 【2026寒假集训】按位或

本题,和上一题一样,都刚开始没写。

后来……直接AC了:

#include <bits/stdc++.h>
using namespace std;
int n,m,a[100005];
int main() {
int T;
cin>>T;
while(T–){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
for(int i=1;i<=n;i++){
if((m|a[i])>m) continue;
ans|=a[i];
}
if(ans==m)cout<<"Yes\\n";
else cout<<"No\\n";
}
return 0;
}

T5:T725288 【2026寒假集训】美好的子串

本题:刚开始也没写,后来CE了,然后又AC了。

代码为:

#include <bits/stdc++.h>
using namespace std;
int s[1000005];
char a[1000005];
int main() {
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int r=1,ans=1;
s[a[1]]=1;
for(int l=1;l<=n;l++){
while (r<n&&s[a[r+1]]<m){
r++;
s[a[r]]++;
}
ans=max(ans,r-l+1);
s[a[l]]–;
}
cout<<ans;
return 0;
}

T6:T725290 【2026寒假集训】方案数

本题刚开始10分……那个不说了。

后来AC了:

#include <bits/stdc++.h>
using namespace std;
long long n,m;
long long quick(long long a,long long n,long long m){
long long ans=1;
while(n){
if(n%2)ans=(ans*a)%m;
n/=2;
a=(a*a)%m;
}
return ans;
}
int main() {
cin>>n>>m;
long long a = quick(m, n, 100007);
long long b = m * quick(m – 1, n – 1, 100007) % 100007;
long long ans = (a – b + 100007) % 100007;

cout << ans << endl;
return 0;
}

附录:

我还是给一下吧:我十分的代码:

#include <bits/stdc++.h>
using namespace std;
int main() {
long long n,m,sum=0;
cin>>n>>m;
if(n==1){
cout<<0;
return 0;
}
for(int i=1;i<n;i++){
sum+=m*2;
}
sum-=m;
cout<<sum;
return 0;
}

题目&思路:

T1:https://www.luogu.com.cn/problem/T725277?contestId=311140

T2:https://www.luogu.com.cn/problem/T725282?contestId=311140

T3:https://www.luogu.com.cn/problem/T725285?contestId=311140

T4:https://www.luogu.com.cn/problem/T725286?contestId=311140

T5:https://www.luogu.com.cn/problem/T725288?contestId=311140

T6:https://www.luogu.com.cn/problem/T725290?contestId=311140

T1:解题思路:

  • 遍历原序列中每一对相邻数
  • 对每一对算 gcd
  • 如果 gcd > 1,答案 +1
  • 最后输出答案
  • T2:解题思路:

    • 8 方向 = 可以斜着走,1 秒能同时减少 1 行差 + 1 列差
    • 所以需要的时间就是较大的那个差

    T3:解题思路:

    1. 关键结论

    要让总花费最小,目标值一定是数组里的某个数。不需要试别的数,只需要枚举数组里每一个数作为目标值,计算花费,取最小即可。


    2. 怎么算花费?

    对每个候选值 x:

    • 如果当前数 num < x:要往上加,花费 (x – num) * a
    • 如果当前数 num > x:要往下减,花费 (num – x) * b
    • 如果 num == x:花费 0

    总花费 = 所有数的花费之和。


    3. 算法步骤

  • 读入 n, a, b 和数组
  • 遍历数组里每一个数作为目标值 x
  • 对每个 x,计算把所有数变成 x 的总花费
  • 所有花费里取最小值,就是答案
  • T4:解题思路:

  • 先把所有能选的数过滤一遍:只保留满足(num & X) == num的数。意思是:这个数的二进制不能有 X 没有的 1。

  • 把这些留下来的数全部或起来,得到 total_or。

  • 如果total_or == X → 输出 Yes否则 → No

  • T5:解题思路:

    核心思想是维护一个动态的区间 [left, right],保证这个区间内的字符串是「美好的」,然后不断尝试扩大这个区间,记录最大的长度。

    T6:解题思路:

  • 计算总方案数:每个小朋友都有 m 种选择,互不干扰。总方案数 = \\(m^n\\)。

  • 计算合法方案数(不糟糕):要求相邻小朋友的礼物绝对不能相同。

    • 第一个小朋友:有 m 种选择。
    • 第二个小朋友:不能和第一个一样,有 m-1 种选择。
    • 第三个小朋友:不能和第二个一样,有 m-1 种选择。
    • 第 n 个小朋友:有 m-1 种选择。合法方案数 = \\(m \\times (m-1)^{n-1}\\)。注意:当 n=1 时,合法方案数就是 m,公式依然成立。
  • 计算糟糕方案数:糟糕方案数 = (总方案数 – 合法方案数) \\(\\mod 10^9+7\\)。

  • 特殊情况处理:由于结果可能为负数(在取模运算中),最终结果需要加上模数再取模,以保证结果为正。

  • 赞(0)
    未经允许不得转载:171主机测评 » 【寒假集训】2026.2.22
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址