`
Coco_young
  • 浏览: 125741 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

TopCoder SRM 543 DIV2

 
阅读更多

昨天熬夜做了人生的第二场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还不是很了解的可以拿来看看

    "Topcoder SRM 499 第一题详解" Topcoder SRM 499 的第一题是一道简单的 Addition Game 题目,旨在考察程序员对问题的理解和算法设计能力。本文将详细讲解该题目的知识点和解题思路。 题目分析 该题目中,Fox ...

    topcoder-srm:Topcoder SRM竞赛解决方案

    【标题】"topcoder-srm:Topcoder SRM竞赛解决方案" 这个标题暗示了这是一个与Topcoder平台上的Single Round Matches (SRM)竞赛相关的资源集合。Topcoder SRM是全球知名的在线编程竞赛,参赛者需要在限定时间内解决...

    TopCoder中文指导

    TopCoder是一个全球知名的在线编程竞赛平台,它提供了多种类型的比赛,包括SRM(Single Round Matches)算法竞赛、Bug Race以及软件设计比赛等。 SRM是TopCoder平台的核心部分,它定期举办算法竞赛,参赛者需要在...

    TC SRM 388 div 2 problem 3

    topcoder的数学类算法题目。一个整数被称为k-smooth当且仅当它的最大素因子不大于k,给定N和K,计算出1 - N中有多少个整数是k-smooth。1 , 1 &lt;= K &lt;= 1000.

    SRMPrograms:我尝试过的TopCoder SRM程序列表。 我在TopCoder上不太活跃,因为大多数时候比赛时间与我的其他工作冲突。 但是我尽力去参加比赛,因为这很有趣

    TopCoder SRM程序 我尝试过的TopCoder SRM程序列表。 在大多数时候,比赛时间与我的工作/其他活动冲突,因此我对TopCoder不太活跃。 但是我尽力去参加比赛,因为这很有趣。 就像在任何在线比赛中所期望的那样,代码...

    topcoder-srm:顶级编码器srm问题集锦

    《顶级编码器SRM问题集锦》是针对Java开发者,特别是热衷于参加TopCoder算法竞赛的程序员们的一份宝贵资源。这个压缩包文件“topcoder-srm-master”包含了丰富的编程挑战,旨在提升你的编程技能,尤其是对于解决复杂...

    TOPCODER 算法PPT1

    【TOPCODER算法PPT1】是一份关于2007年TopCoder竞赛算法讲座的机密文件,它揭示了这个全球知名的编程竞赛平台的核心特点和价值。TopCoder社区是其核心,拥有遍布全球的会员,包括众多活跃的参赛者,涵盖了学生和专业...

    手把手教你玩SRM

    "手把手教你玩SRM"很显然是一份旨在帮助参赛者提升技能的教程资料,SRM通常指的是TopCoder平台上的Single Round Matches,是ACM类在线编程竞赛的一种形式。下面将分别解析两个压缩包子文件的文件内容,它们都是关于...

    Topcoder入门

    2. 教程:关于算法、数据结构、编程语言的基础教程,帮助初学者建立坚实的理论基础。 3. 实战指南:针对Topcoder比赛的策略指导,如如何高效地阅读和理解题目,如何选择合适的算法等。 4. 代码模板:常用算法的代码...

    TOPCODER算法ppt2

    TOPCODER算法ppt2 TOPCODER算法讲座ppt是一个关于TopCoder算法竞赛的讲座ppt,涵盖了TopCoder竞赛的概述、Component Based Methodology、组件目录、软件需求等内容。 在Component Based Methodology中,讲座强调了...

    TopCoder入门相关介绍

    Topcoder软件比赛注册方法和平台使用 Topcoder算法大赛客户端安装流程 Topcoder算法大赛客户端登陆及使用 Topcoder算法大赛注册流程 Topcoder图形比赛注册方法和平台使用

    TopCoder注册及入门介绍

    年度赛事中,参赛者会被分为Div1和Div2两组,每个组别又分为多个房间进行SRM(Single Round Matches)。每个SRM包含三个难度不同的问题,参赛者需在规定时间内编写代码解决问题。 比赛支持的编程语言有Java、C++、...

    topcoder客户端及相关插件

    2. **CodeProcessor.jar**:这是一个Java归档(JAR)文件,包含了topcoder arena中的代码处理逻辑。在比赛中,参赛者编写代码,CodeProcessor会负责编译、测试和评估这些代码,以确定其正确性和性能。 3. **File...

    Topcoder介绍及Arena使用方法

    适合topcoder新手

    TopCoder注册指南

    在IT领域,TopCoder是一个知名的在线编程竞赛平台,它为程序员提供了一个展示技术才华、提升编程技能以及与全球开发者竞技的舞台。注册并参与TopCoder的比赛,不仅能提高自己的编程能力,还能有机会接触到实际项目...

    TopCoder竞赛题基础.pdf

    在SRM144DIV2的250分问题中,题目要求编写一个方法,将从午夜开始的秒数转换为格式化的时分秒字符串。方法签名应为`String whatTime(int seconds)`。秒数参数的范围是0到86399秒(即0到24小时减1秒)。方法的实现...

    TopCoder新手指南

    而在Division 2的比赛中,奖金总额的30%会被分配,每个房间的前两名可以获得奖金。 TopCoder还为用户提供了一些学习资源,比如如何使用Arena进行练习的详细说明,以及如何在coding window中编写代码的指导。这些...

    TopCoder比赛登录客户端

    TopCoder比赛登录使用的客户端,需要配置Java环境

Global site tag (gtag.js) - Google Analytics