昨天熬夜做了人生的第二场SRM,还是有所收获的,总结总结。
250:
超级简单的题,读懂题意就基本上出来了。
500:
一道考异或操作的题,给定一个整数区间[L,R],要求计算L XOR L+1 XOR L+2 XOR ...... XOR R 的值,L,R可以在1-4000000000的范围内。
乍一看,模拟肯定会超时的,于是分解吧,分解成二进制数,根据XOR的性质来看看是否能够有些思路,
把0-15分解成二进制数:
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
逐位的考察,发现第i位,会出现连续的i+1个0或者1,由于异或的性质,xor 0 是不影响的结果的,忽略0的个数,考察1的个数对于i>0的位来讲,只有在[L,R]区间的开始和末尾的一段会对xor后的结果有影响,因为中间的一段1的个数都是2^i的倍数个,xor以后结果仍然是0,那么L,R必然在这特殊的两段内,如果在这两段内第i位的值都是0,那么结果就是0,如果L所在段为1,R所在段为0,那么L所在段异或的结果为 (L mod 2^i),如果L所在段第i位为0,R所在段第i位为1,那么R所在段的异或结果就是not(R
mod 2^i),如果同时为1,考虑两种情况,L,R在同一段内,那么1的个数为(R-L)个,如果L,R不在同一段内,结果就是 (L mod 2^i)xor (not (R mod 2^i)).其实这两种情况都可以归并为L,R不在同一段内的结果,应为考察的段的长度为2^i,是偶数,那么
111......11111
l r
l - r 之间所有1异或的结果其实就等于0-l-1 r+1-2^i这两段内所有1异或的结果。 而如果L,R在同一段内,那么按照第二种方式计算的意义就是 l-2^i 和 0-r 这两段1异或结果的异或,由于异或的性质,l-r这一段实际上相当于没有异或过,所以结果就是0-l-1 r+1-2^i这两段内所有1异或,等价于l-r之间的异或。
而第0位需要特殊处理下,判断[L,R]内第0位为1的个数即可。
各种蛋疼:默认的整数常量是int型,如果需要使用超出int型范围的整数,那么在常量后面加ll比如123ll(当时没测极限数据就交了,导致悲剧了。System Test Failed。。。)
讲了这么多,由于表达力很搓,还是贴出代码,免得以后忘记。。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct EllysXors{
long long p2[64];
void init(){
p2[0]=1;
for(int i=1;i<64;i++){
p2[i] = p2[i-1]<<1;
//cout<<p2[i]<<endl;
}
}
long long getXor(long long L,long long R){
init();
long long ans;
ans = (!(L&1))&&(((R-L+1)/2)%2);
ans = ans||((L&1)&&(((R-L+2)/2)%2));//第一位特殊处理
int len = max((int)log2(L)+1,(int)log2(R)+1);
for(int i=1;i<len;i++){
long long b1,b2,r1,r2;
b1 = !(((1ll<<i)&L)==0);
b2 = !(((1ll<<i)&R)==0);
r1 = L%p2[i];
r2 = R%p2[i];
//cout<<b1<<" "<<b2<<" "<<r1<<" "<<r2<<endl;
if((b1^1)&&(b2^1))ans+=0;//都是0
if((b1&1)&&(b2^1)){
if(!(r1%2))ans+=0;//偶数次1
else ans+=(1ll<<i);//奇数次1
}
if((b1^1)&&(b2&1)){
if(!(r2%2))ans+=(1ll<<i);
else ans+=0;
}
if((b1&1)&&(b2&1)){
long long set=0;
if(r1&1)set=1;
if(!(r2&1))set=!set;
ans+=(set<<i);
}
//cout<<ans<<endl;
}
return ans;
}
};
1000:题目还没看就OVER了。。
分享到:
相关推荐
"Topcoder SRM 499 第一题详解" Topcoder SRM 499 的第一题是一道简单的 Addition Game 题目,旨在考察程序员对问题的理解和算法设计能力。本文将详细讲解该题目的知识点和解题思路。 题目分析 该题目中,Fox ...
【标题】"topcoder-srm:Topcoder SRM竞赛解决方案" 这个标题暗示了这是一个与Topcoder平台上的Single Round Matches (SRM)竞赛相关的资源集合。Topcoder SRM是全球知名的在线编程竞赛,参赛者需要在限定时间内解决...
TopCoder是一个全球知名的在线编程竞赛平台,它提供了多种类型的比赛,包括SRM(Single Round Matches)算法竞赛、Bug Race以及软件设计比赛等。 SRM是TopCoder平台的核心部分,它定期举办算法竞赛,参赛者需要在...
topcoder的数学类算法题目。一个整数被称为k-smooth当且仅当它的最大素因子不大于k,给定N和K,计算出1 - N中有多少个整数是k-smooth。1 , 1 <= K <= 1000.
TopCoder SRM程序 我尝试过的TopCoder SRM程序列表。 在大多数时候,比赛时间与我的工作/其他活动冲突,因此我对TopCoder不太活跃。 但是我尽力去参加比赛,因为这很有趣。 就像在任何在线比赛中所期望的那样,代码...
《顶级编码器SRM问题集锦》是针对Java开发者,特别是热衷于参加TopCoder算法竞赛的程序员们的一份宝贵资源。这个压缩包文件“topcoder-srm-master”包含了丰富的编程挑战,旨在提升你的编程技能,尤其是对于解决复杂...
【TOPCODER算法PPT1】是一份关于2007年TopCoder竞赛算法讲座的机密文件,它揭示了这个全球知名的编程竞赛平台的核心特点和价值。TopCoder社区是其核心,拥有遍布全球的会员,包括众多活跃的参赛者,涵盖了学生和专业...
"手把手教你玩SRM"很显然是一份旨在帮助参赛者提升技能的教程资料,SRM通常指的是TopCoder平台上的Single Round Matches,是ACM类在线编程竞赛的一种形式。下面将分别解析两个压缩包子文件的文件内容,它们都是关于...
2. 教程:关于算法、数据结构、编程语言的基础教程,帮助初学者建立坚实的理论基础。 3. 实战指南:针对Topcoder比赛的策略指导,如如何高效地阅读和理解题目,如何选择合适的算法等。 4. 代码模板:常用算法的代码...
TOPCODER算法ppt2 TOPCODER算法讲座ppt是一个关于TopCoder算法竞赛的讲座ppt,涵盖了TopCoder竞赛的概述、Component Based Methodology、组件目录、软件需求等内容。 在Component Based Methodology中,讲座强调了...
Topcoder软件比赛注册方法和平台使用 Topcoder算法大赛客户端安装流程 Topcoder算法大赛客户端登陆及使用 Topcoder算法大赛注册流程 Topcoder图形比赛注册方法和平台使用
年度赛事中,参赛者会被分为Div1和Div2两组,每个组别又分为多个房间进行SRM(Single Round Matches)。每个SRM包含三个难度不同的问题,参赛者需在规定时间内编写代码解决问题。 比赛支持的编程语言有Java、C++、...
2. **CodeProcessor.jar**:这是一个Java归档(JAR)文件,包含了topcoder arena中的代码处理逻辑。在比赛中,参赛者编写代码,CodeProcessor会负责编译、测试和评估这些代码,以确定其正确性和性能。 3. **File...
适合topcoder新手
在IT领域,TopCoder是一个知名的在线编程竞赛平台,它为程序员提供了一个展示技术才华、提升编程技能以及与全球开发者竞技的舞台。注册并参与TopCoder的比赛,不仅能提高自己的编程能力,还能有机会接触到实际项目...
在SRM144DIV2的250分问题中,题目要求编写一个方法,将从午夜开始的秒数转换为格式化的时分秒字符串。方法签名应为`String whatTime(int seconds)`。秒数参数的范围是0到86399秒(即0到24小时减1秒)。方法的实现...
而在Division 2的比赛中,奖金总额的30%会被分配,每个房间的前两名可以获得奖金。 TopCoder还为用户提供了一些学习资源,比如如何使用Arena进行练习的详细说明,以及如何在coding window中编写代码的指导。这些...
TopCoder比赛登录使用的客户端,需要配置Java环境