[LOJ 5516]无聊的数对

2024-03-16 23:32
文章标签 无聊 loj 5516

本文主要是介绍[LOJ 5516]无聊的数对,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

无聊的数对

题解

好水的题呀,为什么还是这句话???

额,首先,我们知道要使得a\oplus b的__builtin_parityll(即它在二进制下1的个数是否为奇,一下简称parityll为奇的话,a与b的parityll一定是不同的。

这,还是证一下吧。

我们设ap_{a}个1,bp_{b}个1,它们共有的1的个数为p_{c},那么它们异或后的1的个数为p_{a}+p_{b}-2p_{c},它的奇偶性与p_{a}+p_{b}是相同的,所以要使得a\oplus b的1个数为奇,p_{a}+p_{b}必定为奇,于是p_{a}p_{b}的奇偶性不同。

于是答案就成了所有区间内偶数个1的个数乘上奇数个1的个数的积。

然后,我们发现数据规模为2^{32}-1,明显不能直接用暴力。我们就想到了线段树维护所有已选的区间,加上一个动态开点就可以维护整个序列的值了。

时间复杂度是O\left(32n \right ),还是不忽略32了。

源码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<bitset>
#include<set>
using namespace std;
#define MAXN 1000005
typedef long long LL;
#define int LL
typedef pair<int,int> pii;
#define gc() getchar()
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=gc();while(s>'9'||s<'0'){if(s=='-')f=-1;s=gc();}while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=gc();}x*=f;
}
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;} 
int n,root,tot;
int lson[MAXN],rson[MAXN];
int tag[MAXN],odd[MAXN],even[MAXN];
int cal(int x){if(x&1LL)return x+1LL>>1LL;return (x>>1LL)+__builtin_parityll(x);
}
int calc(int l,int r){return cal(r)-cal(l-1);}
void insert(int &rt,int l,int r,int al,int ar){//printf("%d %d:%d %d\n",l,r,al,ar);if(!rt)rt=++tot;if(tag[rt])return ;if(al<=l&&r<=ar){rt=++tot;tag[rt]=1;odd[rt]=calc(l,r);even[rt]=r-l+1-odd[rt];//printf("%d %d:%d %d\n",l,r,odd[rt],even[rt]);return ;}int mid=l+r>>1LL;if(al<=mid)insert(lson[rt],l,mid,al,ar);if(ar>mid)insert(rson[rt],mid+1,r,al,ar);odd[rt]=odd[lson[rt]]+odd[rson[rt]];even[rt]=even[lson[rt]]+even[rson[rt]];tag[rt]|=tag[lson[rt]]&tag[rson[rt]];//printf("%d %d %d %d:%d %d\n",rt,tag[rt],l,r,odd[rt],even[rt]);
}
signed main(){read(n);for(int i=1;i<=n;i++){int l,r;read(l);read(r);insert(root,1,(1LL<<32LL),l,r);printf("%lld\n",odd[root]*even[root]);}return 0;
}
/*
*/

谢谢!!!

这篇关于[LOJ 5516]无聊的数对的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817093

相关文章

洛谷 P1438 无聊的数列

题意 给定一个序列 A = ( A 1 , A 2 , ⋯ , A n ) A=(A_1,A_2,\cdots,A_n) A=(A1​,A2​,⋯,An​)。 现在进行 m m m次操作,分为以下两种: 1 l r k d:给定一个长度为 r − l + 1 r-l+1 r−l+1的等差序列,首项为 k k k,公差为 d d d,并将它对应加到 [ l , r ] [l,r] [l,r]范

一次无聊的尝试——蜂鸣器播放音频 借助Mathematica生成数据

好吧其实是个代码备份 代码不求优雅 完全是能用的标准 audio=Audio["D:\\Users\\flaribbit\\Desktop\\Untitled.wav"]audio=UnitStep[# - 0.2] &[audio]data=Floor[Partition[AudioData[audio][[1]], 8]];StringRiffle["0x" <> IntegerSt

NYOJ 52 无聊的小明

题目链接~~> 做题感悟:这题其实很简单,只是尝试了很久。 解题思路:这题就是取模的思想,一定要注意输出 - 1 的情况,循环必须与第一个次取模得的结果一样,否则如果出现循环不是与第一个产生的循环则输出 - 1 。 代码: #include<stdio.h>#include<string.h>#include<math.h>bool vis[100005] ;int main()

生成随机测验文件-用Python自动化无聊的东西-chapter8

在Python中读取或写入文件有三个步骤。 调用open()函数返回一个File对象。调用对象上的read()或write()方法File。通过调用对象close()上的方法关闭文件File。 项目:生成随机测验文件 说你是一个地理老师,有35名学生在你的班上,你想在美国州首府做一个流行测验。唉,你的班上有几个坏蛋,你不能信任学生不要欺骗。你想随机选择问题的顺序,以便每个测验都是独一

强密码检测-用Python自动化无聊的东西-chapter7

知识点:正则表达式。 强密码检测 编写一个使用正则表达式的函数,以确保其传递的密码字符串很强。强密码被定义为至少八个字符长,包含大写和小写字符,并且至少有一个数字。您可能需要针对多个正则表达式模式测试字符串以验证其强度。 源代码: #checkPassword.py 检测密码强度import redef checkLen(pwd):return len(pwd)>=8def ch

列出游戏库存的字典功能-用Python自动化无聊的东西-chapter5

想象一下,被征服的龙的战利品被表示为这样的字符串: dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] 编写一个名为的函数addToInventory(inventory, addedItems),其中inventory参数是表示玩家的库存的字典(如上一个项目中所示),addedItems参数是一个列表d

记录客人带来的食物的总数-用Python自动化无聊的东西-chapter5

当您模拟更复杂的事情时,您可能会发现需要包含其他字典和列表的字典和列表。列表可用于包含一系列有序的值,并且字典对于将键与值相关联很有用。例如,这是一个使用包含其他字典的字典的程序,以查看谁带来了野餐。该totalBrought()功能可以读取此数据结构,并计算所有客人所携带的物品的总数。 提示:应用到字典中嵌套字典,get()获取。 源代码: allGuests = {'Alice': {'

Collatz 序列(考拉咨猜想),用Python自动化无聊的东西-chapter3

编写一个名为的函数collatz(),它有一个名为的参数number。如果number是偶数,那么collatz()应该打印number // 2并返回这个值。如果number是奇数,collatz()则应打印并返回3 * number + 1。 然后编写一个程序,让用户键入一个整数,并持续调用collatz()该数字,直到函数返回值1。(很奇怪,这个序列实际上适用于任何整数 - 早或晚,使用这

猜数字的游戏Python3,用Python自动化无聊的东西-chapter3

写一个猜数字的游戏,在运行这个程序的时候,输出看起来像: I am thinking of a number between 1 and 20.Take a guess.10Your guess is too low.Take a guess.15Your guess is too low.Take a guess.17Your guess is too high.Tak