cf 2*题

本文探讨了如何解决数论构造中的奢侈数问题,通过分析每个数最多有三个奢侈数的情况,提出了一种求[l, r]区间内奢侈数个数的算法。同时,文章还介绍了字符串成环判断的错误及其解决方案,利用并查集判断字符串是否形成环,并给出具体实现代码。
摘要由CSDN通过智能技术生成

一道数论构造,一道字符串。
数论构造没有递推,想的算法复杂度太大了,没写。
字符串判断成环错误,其他简单

B. Ela’s Fitness and the Luxury Number

题目大意: [ l, r ] 两个边界,判断有几个奢侈数。
奢侈数定义: A % [ (int) sqrt(A) ] == 0 ;;; [] 向下取整

分析: 每一个数最多有三个奢侈数
A, t = [ sqrt(A) ] ,
A >= tt + t
A >= t
t + t2
A >= t
t

void solve() {
	// 函数 -- 得到x有几个奢侈数;;
	auto getl = [] (LL x) {
		LL t = sqrt(x);
		// 可能有精度损失,判断 t方 大于 x时, -- t;
		if(t * t > x) --t;
		// res 1 到 x 有几个奢侈数
		LL res = (t-1)*3;

		// 1
		if(x >= t*t) res++;
		// 2
		if(x >= t*t + t*1) res++;
		// 3
		if(x >= t* t + t* 2) res++;
		return res;
	};
	LL l, r; cin>>l>>r;
	cout<<getl(r) - getl(l-1)<<endl; 
}

C. Phase Shift

题目大意: 26个字母按连成一个环,每次顺时针向前。

分析:刚开始用unordered_map<char,char> 判断是否成环,但是我只判断了与头位置的部分,但是没有判断其他位置的部分。看了别人的题解,发现用并查集可以判断加入是否成环。

void cir() {
	y
	if(find(x) == find(y)) isCir;
	else {
		insert(p[x] = y);
	}
}
void solve() {
	// char(0) == '\0' 
	memset(c, 0, sizeof(c));
	memset(p, 0, sizeof(p));
	rep(i,'a', 'z') p[i] = char(i);
	int n; string str; cin>>n>>str;

	int cnt = 0;
	for(auto ch: str) {
		if(c[ch] != char(0)) {
			cout<<c[ch]; continue;
		}

		for(char j = 'a'; ; ++j) {
			// j 大于 'z' 时,j 就为 'a'
			if(j == 'z' + 1) j = 'a';
			// 判断是否成环,cnt 要小于 25
			if(find(j) == find(ch) && cnt < 25) continue;
			// 不相等,即不自环。无操作。
			if(j != ch && c[ch] == char(0) && p[j] == j) {
				p[j] = ch; // 尾环
				c[ch] = j;
				cnt++;
				cout<<c[ch];
				break;
			} 
		}
	}
	puts("");
}```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

golemon.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值