纪念我菜的真实的一场模拟赛

首先看到这个题目,一开始就很毒瘤。一定是没有办法直接做的。

我们考虑转化问题

假设,我们选择枚举\(x\),其中\(x\)是\(10\)的若干次方,那么我们只需要求有多少对异或完比\(x\)大的数,那么就是\(x\)对于答案的贡献了。

那么应该怎么求比多少对呢?

!!!trie!!!

对于trie的每个节点,我们维护他的子树里面的数的个数,记为\(size[x]\)

我们考虑把每一个串放进trie里面去跑,如果当前这个数的这一位是1,而10的几次方对应的也是1的话,那么当前位只能选择0,即\(root=ch[root][0]\),如果10的几次方对应的位是0的话,那么这一位选择0一定是全都满足条件的,是1的不一定,那么我们可以把0的那边记录进答案里面,然后走1的那边试一试,\(ans=ans+ch[root][0],root=ch[root][1]\)

另一种情况同理

不过需要注意的是,因为我们的贪心的放,所以必须从高位到低位来循环

int query(int now,int lim)
{
int root=1;
int ans=0;
for (register int i=62;i>=0;--i)
{
if (!root) break;
if (now&(1ll << i))
{
if (lim & (1ll << i))
root=ch[root][0];
else
ans=ans+sum[ch[root][0]],root=ch[root][1];
}
else
{
if (lim&(1ll <<i))
root=ch[root][1];
else
ans=ans+sum[ch[root][1]],root=ch[root][0];
}
}
return ans;
}

对于每一个,我们都这么算,那么最后的\(ans/2\),就是我们要的答案

因为每一对,我们会重复算两遍

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define mk makr_pair
#define ll long long
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 1e5+1e2;
int n;
int a[maxn];
int ch[7000000][3];
int tot=1;
int ans;
int sum[7000000];
void insert(int now)
{
int root=1;
for (register int i=62;i>=0;--i)
{
int x = (now & (1ll << i));
if (x!=0) x=1;
else x=0;
if (!ch[root][x]) ch[root][x]=++tot;
root=ch[root][x];
sum[root]++;
}
//cout<<tot<<endl;
}
int query(int now,int lim)
{
int root=1;
int ans=0;
for (register int i=62;i>=0;--i)
{
if (!root) break;
if (now&(1ll << i))
{
if (lim & (1ll << i))
root=ch[root][0];
else
ans=ans+sum[ch[root][0]],root=ch[root][1];
}
else
{
if (lim&(1ll <<i))
root=ch[root][1];
else
ans=ans+sum[ch[root][1]],root=ch[root][0];
}
}
return ans;
}
int qsm(int i,int j)
{
//if (j==0) return 0;
int ans=1;
while (j)
{
if (j&1) ans=ans*i;
i=i*i;
j>>=1;
}
return ans;
}
signed main()
{
n=read();
for (int i=1;i<=n;++i) a[i]=read();
for (register int i=1;i<=n;++i) insert(a[i]);
int pre=0;
for (register int i=0;i<=18;++i)
{
int cnt=0;
for (register int j=1;j<=n;++j)
{
cnt=cnt+query(a[j],qsm(10,i)-1);
//cout<<i<<" "<<cnt<<endl;
}
ans=ans+cnt;
}
cout<<ans/2;
return 0;
}

LOJ6469 Magic(trie)的更多相关文章

  1. 【python】Leetcode每日一题-前缀树(Trie)

    [python]Leetcode每日一题-前缀树(Trie) [题目描述] Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的 ...

  2. LA3942-Remember the Word(Trie)

    题意: 有s个不同的单词,给出一个长字符串把这个字符串分解成若干个单词的连接(可重复使用),有多少种分解方法 分析: dp[i]表示i开始的字符串能分解的方法数 dp[i]=sum(dp[i+len( ...

  3. HDU 1671 Phone List (Trie)

    pid=1671">Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  4. hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)

    统计难题Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submis ...

  5. 字典树(Trie)的java实现

    一.定义 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用 ...

  6. HDU 4825-Xor Sum(trie)

    题意: 给你一组数,开始询问给一个数  求组中与该数异或值最大的数. 分析:根据异或的特点 要想得到的异或值最大 尽可能的让两个数的每位都相反 先把给定的一组数建树,数的最后一位对应的节点保存这个数的 ...

  7. 【UER #1】跳蚤OS(Trie)

    跳蚤OS 是跳蚤国自主研发的功能强大的操作系统. 跳蚤OS的文件系统与普通的文件系统类似,是个文件夹套文件夹的结构.文件系统根目录称为“//”.我们可以用文件路径来表明文件所在的位置,比如“/flea ...

  8. UVA - 11732 "strcmp()" Anyone? (trie)

    https://vjudge.net/problem/UVA-11732 题意 给定n个字符串,问用strcmp函数比较这些字符串共用多少次比较. strcmp函数的实现 int strcmp(cha ...

  9. hihoCoder 1014 Trie树 (Trie)

    #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi和小Ho是一对好朋友.出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮 ...

随机推荐

  1. 打印菱形图案(PTA)

    打印菱形图案 本题要求编写程序,打印一个高度为n的.由"*"组成的正菱形图案. 标题输入格式 输入在一行中给出一个正的奇数n. 输出格式 输出由n行星号"*"组 ...

  2. Javascirpt 面向对象总结-继承

    JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个动物类 function Animal (name) { // 公有属性 this.name = name || ...

  3. Ajax重构

    Ajax重构简介 Ajax的实现主要依赖于XMLHttpRequest对象,但是在调用其进行异步数据传输时,由于XMLHttpRequest对象的实例在处理事件完成后就会被销毁,所以如果不对该对象进行 ...

  4. Shell中的运算

    1.运算方式及运算符号 2.SHELL 中常用的运算命令 3.相关操作演示 1.用脚本写一个10秒倒计时 脚本的执行: 2.编写脚本,1分10秒的倒计时 执行脚本: 3.编写脚本,制作一个计算器 脚本 ...

  5. WebService学习总结(六)--CXF 与Spring结合+tomcat发布

    该项目在上文   WebService学习总结(四)--基于CXF的服务端开发  的基础上修改为spring上发布的webservice接口 1.新建web project 工程 2.导入spring ...

  6. 这款打怪升级的小游戏,7 年前出生于 GitHub 社区,如今在谷歌商店有 8 万人打了满分

    今天我在 GitHub 摸鱼寻找新的"目标"时,发现了一个开源项目是 RougeLike 类的角色扮演游戏「破碎版像素地牢」(Shattered Pixel Dungeon)类似魔 ...

  7. 2021秋 noip 模拟赛

    9.9 T3 第负二题 \(f_i\) 的数学意义:中心在第 \(i\) 行的全 \(1\) 组成的最大正方形(对角线水平/竖直),对角线长 \(2f_i-1\). 显然 \(f_i\) 具有单调性( ...

  8. 理解ASP.NET Core - [04] Host

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 本文会涉及部分 Host 相关的源码,并会附上 github 源码地址,不过为了降低篇幅,我会 ...

  9. 第25篇-虚拟机对象操作指令之putstatic

    之前已经介绍了getstatic与getfield指令的汇编代码执行逻辑,这一篇介绍putstatic指令的执行逻辑,putfield将不再介绍,大家可以自己去研究,相信大家有这个实力. putsta ...

  10. 2021ICPC网络赛第一场部分题解-The 2021 ICPC Asia Regionals Online Contest (I)

    写在前面 本来应该6题的,结果不知道哪个铸币发了H的clar,当即把我们的思路转向三维几何上.当时我们还在想这三维计算几何的正确率有点太高了还在感叹ICPC选手的含金量,直到赛后我才知道这H题的铸币出 ...