Codeforces Round 964 div4
Codeforces Round 964 div4
第一次vp,也是第一次打div4,并不是很清楚难度如何,所以vp时经常把题目想的过于复杂,同时手速码力还是有点弱,感觉有时候会很 混乱
A. A+B Again?
https://codeforces.com/contest/1999/problem/A
两位数直接对10求除和模即可,即
,我vp时思路直接对数进行除
B. Card Game
https://codeforces.com/contest/1999/problem/B
题意:两个人各有两个手牌,然后任意顺序安排手牌顺序去比较,每次出一张,比对方的手牌大则获胜,相等平局,否则则输,只有两次比较后比分比对方大这局才获胜,因此我们求可能的获胜局数。
一开始的想法就是直接用next_permutation写模拟,结果脑袋不清醒没想好怎么打,后来想到只需要写二重循环,没选中的牌进行比较即可,这里也因为是2个所以可以通过对2求模来找到未被选中的牌
void solve() {
int a[2],b[2];
std::cin >> a[0] >> a[1] >> b[0] >> b[1];
int ans = 0;
for(int i = 0;i <= 1;i ++ )
for(int j = 0;j <= 1;j ++ ) {
int cnt = 0;
if(a[i] > b[j]) cnt ++;
else if(a[i] < b[j]) cnt --;
if(a[(i + 1) % 2] > b[(j + 1) % 2]) cnt ++;
else if(a[(i + 1) % 2] < b[(j + 1) % 2]) cnt --;
// std::cout << cnt << "\n";
if(cnt > 0) ans ++;
}
std::cout << ans << "\n";
}
C. Showering
https://codeforces.com/contest/1999/problem/C
这题真是唐中唐,不知道为什么上来就开始写差分,后来发现对端点差分不好判断长度,遂直接对线段按做端点排序直接判断两个线段间隔是否满足,同时注意第一条线段需不需要和0比较与最后一条线段需不需要和1比较
修改:这里不能进行排序,题目中给了有序,同时如果循环中有输入是不可以进行break
void solve() {
int n,s,m;
bool flag = false;
std::cin >> n >> s >> m;
int pre = 0,l = 0,r = 0;
for(int i = 1;i <= n;i ++) {
std::cin >> l >> r;
if(l - pre >= s) flag = true;
pre = r;
}
if(m - pre >= s) flag = true;
std::cout << (flag ? "Yes" : "No") << "\n";
}
D. Slavic's Exam
https://codeforces.com/contest/1999/problem/D
题意:给一个含?的字符串a与字符串b,?可以任意改,是否能够让b成为a的子序列
思路:依次在a中比较b的每个字符,如果是?则将其改为对应的b中的字符。之后在直接判断b是否是a的子序列,具体实现是双指针
写完C就已经3点多了,脑子着实有点不清醒了,所以调的就开始很慢了(还是太菜了)
std::string a,b;
void solve() {
std::cin >> a;
std::cin >> b;
int j = 0;
for(auto &i : a) {
if(j == b.size()) break;
if(i == b[j]) {
j ++;
continue;
}
if(i == '?') i = b[j ++];
}
j = 0;
for(int i = 0;i < a.size();i ++ ) {
if(a[i] == b[j]) j ++;
else if(a[i] == '?') a[i] = a[i - 1];
}
if(j >= b.size()) {
std::cout << "YES\n";
for(auto i : a)
std::cout << i;
std::cout << "\n";
}else std::cout << "NO\n";
}
E. Triple Operations
https://codeforces.com/contest/1999/problem/E
题意:给一个序列,选择一对数
, 进行一次操作后则变为 ,
思路:先选取最小的数操作至0,之后的操作就是选取0与其他非0数进行操作,需要注意的是操作最小数时会同时乘对应次数的3,只需要算出最小数操作为0的次数乘2即可。因为是算从到 的数的操作的次数,因此我们可以通过前缀和来进行优化。
求一个数操作为0的次数可以先预处理出来,因为是从 到 是连续的,因此我们只需要 的复杂度就可以处理出来
const int N = 200010, INF = 0x7fffffff,Mod = 998244353;
int l,r,f[13],p[N];
void init() {
f[0] = 1;
for(int i = 1;i <= 13;i ++ )
f[i] = f[i - 1] * 3;
}
void init_() {
p[0] = 0;
p[1] = 1;
int pre = 1;
for(int i = 2;i <= 200010;i ++ ) {
if(f[pre] <= i) pre ++;
p[i] = pre;
p[i] += p[i - 1];
}
}
void solve() {
std::cin >> l >> r;
int ans = 0;
ans += p[r] + p[l] - 2 * p[l - 1];
std::cout << ans << "\n";
}
signed main() {
FastIO;
// freopen("in.txt", "r", stdin);
// freopen("me.txt", "w", stdout);
int _;
_= 1;
std::cin >> _;
init();
init_();
while(_ --)
{
solve();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!