Codeforces 768B Code For 1

探讨一个有趣的问题:如何帮助角色Sam解决一个算法挑战,通过不断将列表中的元素分解为更小的部分,直到所有元素变为0或1,并计算指定范围内1的数量。


B. Code For 1
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Jon fought bravely to rescue the wildlings who were attacked by the white-walkers at Hardhome. On his arrival, Sam tells him that he wants to go to Oldtown to train at the Citadel to become a maester, so he can return and take the deceased Aemon's place as maester of Castle Black. Jon agrees to Sam's proposal and Sam sets off his journey to the Citadel. However becoming a trainee at the Citadel is not a cakewalk and hence the maesters at the Citadel gave Sam a problem to test his eligibility.

Initially Sam has a list with a single element n. Then he has to perform certain operations on this list. In each operation Sam must remove any element x, such that x > 1, from the list and insert at the same position  sequentially. He must continue with these operations until all the elements in the list are either 0 or 1.

Now the masters want the total number of 1s in the range l to r (1-indexed). Sam wants to become a maester but unfortunately he cannot solve this problem. Can you help Sam to pass the eligibility test?

Input

The first line contains three integers nlr (0 ≤ n < 2500 ≤ r - l ≤ 105r ≥ 1l ≥ 1) – initial element and the range l to r.

It is guaranteed that r is not greater than the length of the final list.

Output

Output the total number of 1s in the range l to r in the final sequence.

Examples
input
7 2 5
output
4
input
10 3 10
output
5
Note

Consider first example:

Elements on positions from 2-nd to 5-th in list is [1, 1, 1, 1]. The number of ones is 4.

For the second example:

Elements on positions from 3-rd to 10-th in list is [1, 1, 1, 0, 1, 0, 1, 0]. The number of ones is 5.


题意:给你一个数n和区间l,r,每次都能把任意数拆成n/2,n%2,n/2三个数,直到变成0和1,问区间l,r里有多少个1。

思路:做法类似线段树的查询,很明显对给定的数n,它拆到最后的长度是能算出来的。然后递推求出每一位上的数是多少然后求和就好了。看代码吧:

#include<cstdio>  
#include<algorithm>  
#include<cstring>  
#include<iostream>  
#include<cmath>  
#include<queue>  
#include<functional>  
typedef long long LL;
using namespace std;
#define maxn 1000005
#define ll l,mid,now<<1  
#define rr mid+1,r,now<<1|1  
#define lson l1,mid,l2,r2,now<<1  
#define rson mid+1,r1,l2,r2,now<<1|1  
#define inf 0x3f3f3f3f  
const int mod = 1e9 + 7;
LL query(LL l1,LL r1,LL l2,LL r2,LL nownumber){
	if (l1 == r1)
		return nownumber;
	LL mid = l1 + r1 >> 1;
	LL a = 0, b = 0, c = 0;
	if (l2 < mid)
		a = query(l1, mid - 1, l2, r2, nownumber >> 1);
	if (r2 > mid)
		b = query(mid + 1, r1, l2, r2, nownumber >> 1);
	if (l2 <= mid && r2 >= mid)
		c = nownumber % 2;
	return a + b + c;
}
int main(){
	LL n,l, r;
	scanf("%lld%lld%lld", &n, &l, &r);
	LL len = 1;
	LL now = n;
	LL add = 2;
	while (now > 1){
		now >>= 1;
		len += add;
		add <<= 1;
	}
	printf("%lld\n", query(1, len, l, r, n));
}


### Codeforces M1 Contest 或 Problem Information Codeforces 是一个在线编程竞赛平台,提供多种类型的算法挑战和比赛。关于提到的 “M1”,可能指的是特定的比赛编号或者题目名称的一部分。以下是有关如何查找与“M1”相关的页面或信息的方法: #### 如何搜索 Codeforces 中的 M1 相关内容 可以通过以下方式定位到具体的比赛或问题: - **通过比赛列表查询**:进入 Codeforces 的主页后,在导航栏找到并点击“Contests”。这会显示所有的公开比赛列表[^1]。 - **使用搜索引擎功能**:在网站顶部有一个内置的搜索框,可以直接输入关键词如 `M1` 进行检索。如果存在名为 `M1` 的比赛或问题,则可以快速跳转至目标页面。 - **查看具体问题集**:有时,“M1”可能是某个比赛中的一道题目的简称。在这种情况下,需要浏览对应比赛下的所有题目描述来确认是否有匹配项[^2]。 #### 示例代码片段用于解析 HTML 页面获取数据 (Python) 下面是一个简单的 Python 脚本例子,展示如何利用 requests 和 BeautifulSoup 库抓取网页上的信息,并筛选出包含关键字 'M1' 的部分链接地址作为进一步探索的方向之一: ```python import requests from bs4 import BeautifulSoup def search_codeforces(keyword='M1'): url = f"https://codeforces.com/contests" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") links = [] for a_tag in soup.find_all('a', href=True): link_text = a_tag.string.strip() if a_tag.string else '' if keyword.lower() in link_text.lower(): full_link = "https://codeforces.com" + a_tag['href'] links.append(full_link) return links if __name__ == "__main__": results = search_codeforces() print("\n".join(results)) ``` 此脚本仅作示范用途,请注意实际操作时应遵循各站点的服务条款以及法律法规。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值