980 字
3 分钟
Codeforces_Round_1107(Div. 3)(A~D题)
2026-07-01
浏览量 202 · 访客 14

思维大挑战这一块。
题目链接:https://codeforces.com/contest/2241

A - Divide and Conquer#

大致题意:给定xxyyxx通过执行任意次(包括零次)除以自己任意的约数(因数)的操作可以得到yy。判断这xxyy是否满足这个条件。
思路:通过题意我们可以知道其实只有当yyxx的因数的时候才满足条件。在这种情况下yy一定能和xx的另一个因数相乘得到xx。我们判断yyxx的因数时就输出YESYES,否则就NONO

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define endl '\n'
#define mod 998244353
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
void solved() {
int x, y;
cin >> x >> y;
if(x % y == 0) cout << "YES" << endl;
else cout << "NO" << endl;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int _ = 1;
cin >> _;
while (_--) {
solved();
}
return 0;
}

B - Good times Good times#

大致题意:给定一个好数xx(所有十进制位上的出现的不同数字最多包含两种不同的数字),我们要找出另外一个好数yy,使得x×yx \times y也是好数。
思路:这里我想到的构造方法是根据xx的十进制位数LL来构造一个y=10L+1y = 10 ^ L + 1,这样的yy只有0011,所以满足是好数的条件。举个例子对于7373我们生成101101,相乘结果为73737373,满足题意。对于299299我们生成10011001,相乘结果为299299299299,个位的11乘以xx后就将最高位和个位之间的00全填满了,保证不会出现00,由此能构造出满足条件的好数yy

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define endl '\n'
#define mod 998244353
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
void solved() {
string x; cin >> x;
ll y = 1;
for(int i = 0; i < (int)x.size();i++) y *= 10;
cout << y + 1 << endl;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int _ = 1;
cin >> _;
while (_--) {
solved();
}
return 0;
}

C - RemovevomeR#

大致题意:对于一个只包含0011的字符串ss,可以进行任意次下面的操作:选一个ss里长度至少为22的回文子串,从这个回文子串里删掉一个字符,剩下的字符拼接成新的字符串ss,求任意次操作完之后的ss最短是多少。
思路:首先全11和全00ss最终结果为11。然后我们通过手动模拟这样的操作可以发现一个规律:如果子串存在一个xoxxox(比如101101,或者010010)的结构,那么就可以通过一定的操作使得最终的ss的长度为11。反之除了这两种情况之外都会剩下0011两个字符各一个,结果为22。所以特判这两个特殊情况为11,其他都是22即可。
这里的实现我可能写的比较复杂,原理就是pos1pos1pos0pos0分别记录1100的下标。然后有如果其中一个为空就说明是全00或全11的情况直接输出11。否则就根据第一个元素是0011来遍历对应0011的下标数组的元素找下标。如果这个数组里所有的元素都是递增的就说明没有出现xoxxox的结构,最终就输出22。否则就直接输出11

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define endl '\n'
#define mod 998244353
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
void solved() {
int n; cin >> n;
vector<int> pos0, pos1;
string s; cin >> s;
for(int i = 0; i < (int)s.size();i++){
if(s[i] == '0') pos0.push_back(i);
else pos1.push_back(i);
}
if(!pos1.size() || !pos0.size()){
cout << 1 << endl;
return;
}
char first = s[0];
vector<int> pos = (first == '0' ? pos0 : pos1);
for(int i = 0;i < (int)pos.size() - 1;i++){
if(pos[i] + 1 == pos[i + 1]) continue;
else{
cout << 1 << endl;
return;
}
}
cout << 2 << endl;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int _ = 1;
cin >> _;
while (_--) {
solved();
}
return 0;
}

D - An Alternative Way#

大致题意:给定连两个长度都为nn的数组aabb,你可以通过对aa进行任意次一下操作:选择两个索引llrr,满足1<=l<=r<=n1 <= l <= r <= n,对llrr之间的索引ii,执行ili - l为计数则ai=ai+1a_i = a_i + 1,如果ili - l为偶数则ai=ai+1a_i = a_i + 1。 问最终能否使得aa变成bb
思路:我们注意到这个操作实现了一个交替加减(1,1,1,1...)(1,-1,1,-1...)的操作。我们用一个c[i]=b[i]a[i]c[i] = b[i] - a[i]记录每一个a[i]a[i]变成b[i]b[i]需要的变化值。比如a1,4,5,2a:1, 4, 5, 2b1,5,4,3b:1, 5, 4, 3cc就是0,1,1,10, 1, -1, 1。这个样例是可以通过操作[2,4][2,4]一步变成bb的,故输出YESYES
此外更重要的是,我们注意到这个cc数组形成的前缀和中的每一项总是大于等于00的。cc的前缀和prepre数组为0,1,0,10, 1, 0, 1,对于一个pre[i]pre[i],它的含义其实是在以当前ii为左端点的区间需要操作多少次,所以pre[i]pre[i]的值必须大于等于00,反之如果小于00就无法通过这样操作最终变成bb。所以我们直接判断每一个cc的前缀和是否小于00,如果小于00就输出NONO,否则就输出YESYES即可。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define endl '\n'
#define mod 998244353
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
void solved() {
int n; cin >> n;
vector<ll> a(n + 1), b(n + 1);
for(int i = 1; i <= n;i++) cin >> a[i];
for(int i = 1; i <= n;i++) cin >> b[i];
ll pref = 0;
for(int i = 1; i <= n;i++){
pref += b[i] - a[i];
if(pref < 0){
cout << "NO" << endl;
return;
}
}
cout << "YES" << endl;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int _ = 1;
cin >> _;
while (_--) {
solved();
}
return 0;
}
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Codeforces_Round_1107(Div. 3)(A~D题)
https://mkrari.cn/posts/cf_round_1107_div3/
作者
Mkrari
发布于
2026-07-01
许可协议
CC BY-NC-SA 4.0