【Codeforces】1109 Round #539 (Div. 1)B-F题解

这篇博客详细解析了Codeforces 1109 场竞赛中的B到F题,包括Sasha遇到的各种问题解决策略。B题讨论了回文字符串的切割,C题涉及离散化和数据结构的应用,D题是图论的有趣事实,E题是数论和快速幂运算的应用,F题则探讨了格子连通性和线段树的使用。

传送门:CF1109


B.Sasha and One More Name

首先判断全部相同或是奇回文且只有 m i d mid mid不同的情况,无解。

如果是奇回文,至少都要切 2 2 2刀,且下界一定能达到。
如果是偶回文,不断把字符串长度 / 2 /2 /2(砍一半),直到出现奇回文或不回文子串:
若出现奇回文,还是至少切 2 2 2刀的情况,且下界一定能达到。
否则只用切一刀。

#include<bits/stdc++.h>
#define fl() puts("Impossible"),exit(0)
using namespace std;
const int N=5003;

int n;
char s[N];

int main(){
   
   
	int i,j,mid;
	scanf("%s",s+1);
	n=strlen(s+1);mid=n>>1;
	for(i=2;i<=mid && (s[i]==s[i-1]);++i);
	if(i>mid) fl();
	if(n&1) puts("2");
	else{
   
   
		for(;;mid>>=1){
   
   
			for(i=1;mid-i+1>i && (s[i]==s[mid-i+1]);++i);
			if((mid-i+1<=i) && (mid&1)) {
   
   puts("2");break;}
	 	    else if(mid-i+1>i){
   
   puts("1");break;}
		}
	}
	return 0;
	
}

C.Sasha and a Patient Friend

大概可以把 l , r l,r l,r离散化之后套个 s e t + 线 段 树 set+线段树 set+线
然而直接 B S T BST BST维护每次查询二分。

代码咕咕咕。


D.Sasha and Interesting Fact from Graph Theory

枚举 a , b a,b a,b链上的点数 k ( 0 ≤ k ≤ n − 2 ) k(0\leq k\leq n-2) k(0kn2)

选出 k k k个点的方案 ( n − 2 ) ! ( n − 2 − k ) ! \dfrac{(n-2)!}{(n-2-k)!} (n2k)!(n2)!,链上 k + 1 k+1 k+1条边边权方案 ( m − 1 k ) \dbinom{m-1}{k} (km1),剩下 n − k − 2 n-k-2 nk2条边边权的方案 m n − k − 2 m^{n-k-2} mnk2

关于怎么统计把剩下 n − 2 − k n-2-k n2k任意连向这条链的方案数,存在 Cayley’s formula \text{Cayley&#x27;s formula} Cayley’s formula
f ( n , k ) = k ⋅ n n − k − 1 f(n,k)=k·n^{n-k-1} f(n,k)=knnk1

n n n个点的森林 k k k个连通块,且 1 , 2 , . . . , k 1,2,...,k 1,2,...,k在不同连通块中的方案数。
数学归纳法证明-ymz

a n s = ∑ k = 0 n − 2 ( n − 2 ) ! ( n − 2 − k ) ! ( m − 1 k ) m n − k − 2 f ( n , k + 2 ) ( m o d 1 0 9 + 7 ) ans=\sum \limits_{k=0}^{n-2}\dfrac{(n-2)!}{(n-2-k)!}\dbinom{m-1}{k}m^{n-k-2}f(n,k+2) \pmod {10^9+7} ans=k=0n2(n2k)!(n2)!(km1)mnk2f(n,k+2)(mod109+7)


E. Sasha and a Very Easy Test

m o d mod mod最多只有 9 9 9个不同的质因子,设 m o d mod mod质因子集合为 p p p

考虑构造两个线段树,第一颗维护原值,第二颗维护 a i a_i ai去掉所有 p p p中因子的值 b i b_i bi,且 a i a_i a

### Codeforces Round 1005 Div. 2 A-F Problem Solutions #### A. Money Change 为了处理货币转换问题,可以将所有的金额都转化为分的形式来简化计算。通过遍历输入数据并累加各个部分的金额,最后求得剩余的钱数并对100取模得到最终结果[^2]。 ```cpp #include <iostream> using namespace std; int main() { int s, xi, yi; cin >> s; int total_cents = 0; for (int i = 0; i < s; ++i) { cin >> xi >> yi; total_cents += xi * 100 + yi; } cout << (s * 100 - total_cents) % 100 << endl; } ``` #### B. Odd and Even Pairs 此题目要求找到至少一对满足条件的索引:要么是一个偶数值的位置,或者是两个奇数值位置。程序会读入测试次数`t`以及每次测试中的数组长度`n`及其元素,并尝试找出符合条件的一对索引输出;如果没有这样的组合则返回-1[^3]。 ```cpp #include <cstdio> int main() { int t, n, num; scanf("%d", &t); while (t--) { int evenIndex = 0, oddIndex1 = 0, oddIndex2 = 0; scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d", &num); if (num % 2 == 0 && !evenIndex) evenIndex = i; else if (num % 2 != 0) { if (!oddIndex1) oddIndex1 = i; else if (!oddIndex2) oddIndex2 = i; } if ((evenIndex || (oddIndex1 && oddIndex2))) break; } if (evenIndex) printf("1\n%d\n", evenIndex); else if (oddIndex1 && oddIndex2) printf("2\n%d %d\n", oddIndex1, oddIndex2); else printf("-1\n"); } return 0; } ``` 由于仅提供了前两道题的具体描述和解决方案,在这里无法继续给出完整的C至F题解答。通常情况下,每一道竞赛编程题都有其独特的挑战性和解决方法,建议查阅官方题解或社区讨论获取更多帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值