也许更好的阅读体验

\(\mathcal{Description}\)

\(\mathcal{Solution}\)

有两种方法都可以拿到满分

\(Solution\ 1\)

考虑枚举\(y\)

建两个\(01Trie\),要支持删除操作

一颗\(Trie\)维护\(y\)左边的信息

一颗\(Trie\)维护\(y\)右边的信息

在枚举\(y\)的时候左边的添加,右边的删除,可做到\(log\)维护,建树是\(nlog\)

暴力的想法是两个\(Trie\)一起跑,枚举在哪一位开始不一样,前面的情况也都枚举,这样的情况最坏是\(2\)的指数级别,可以拿到\(50\)分

考虑优化这个过程

因为每次只会删去一条链,所以考虑这条链被删去所带来的影响

用\(f[i][0/1]\)表示到第\(i\)位开始不一样的答案

每次删除时只少了一条链,所以把这条链的情况减去

增加时加上新的情况即可

\(Solution\ 2\)

这种方法相对来说代码量要少很多

考虑枚举\(z\)

用一颗\(Tire\)表示前面的信息

仍然考虑枚举在哪一位开始不一样\((d)\)

记\(s[i][0/1]\)表示前面所有在第\(i\)位为\(0/1\)的串的总数

记\(sum[i]\)表示\(Tire\)上\(i\)号节点有多少个不合法的\((x,y)\)对\((y<x)\)

记\(cnt[i]\)表示\(Tire\)上经过\(i\)的个数

由于枚举的是\(z\),我们对\(y\)的要求只有 枚举到\(d\)时,其在\(d\)是\(0\)还是\(1\)

假设枚举到的\(z\)的值在\(d\)位是\(c\)

答案就是cnt[原本串中和\(z\)的\(d\)前面的位相同]\(\times s[d][!c]-\)不合法的\((x,y)\)对数

具体可看代码

\(\mathcal{Code}\)

\(Solution\ 2\)

因为这种好实现些,所以就写的这种

/*******************************
Author:Morning_Glory
LANG:C++
Created Time:2019年09月23日 星期一 19时48分07秒
*******************************/
#include <cstdio>
#include <fstream>
#include <cstring>
#define ll long long
#define reset(x) memset(x,0,sizeof(x))
using namespace std;
const int maxn = 3000006;
const int lim = 29;
//{{{cin
struct IO{
template<typename T>
IO & operator>>(T&res){
res=0;
bool flag=false;
char ch;
while((ch=getchar())>'9'||ch<'0') flag|=ch=='-';
while(ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch^'0'),ch=getchar();
if (flag) res=~res+1;
return *this;
}
}cin;
//}}}
int T,n,v,tot;
int ch[maxn][2],s[lim+1][2];
ll sum[maxn],cnt[maxn];
void insert (int rt,int v,int d)
{
if (d<0) return;
int c=(v>>d)&1;
if (!ch[rt][c]) ch[rt][c]=++tot;
rt=ch[rt][c];
++cnt[rt],sum[rt]+=++s[d][c];
insert(rt,v,d-1);
}
ll query (int rt,int v,int d)
{
if (d<0) return 0;
int c=(v>>d)&1,p=ch[rt][c^1];
return cnt[p]*s[d][c^1]-sum[p]+query(ch[rt][c],v,d-1);
}
int main()
{
cin>>T;
while (T--){
cin>>n;
ll ans=tot=0;
reset(sum),reset(s),reset(ch),reset(cnt);
for (int i=1;i<=n;++i){
cin>>v;
insert(0,v,lim);
ans+=query(0,v,lim);
}
printf("%lld\n",ans);
}
return 0;
}

如有哪里讲得不是很明白或是有错误,欢迎指正

如您喜欢的话不妨点个赞收藏一下吧

三元组[01 Trie计数]的更多相关文章

  1. hdu 4825 Xor Sum (01 Trie)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题面: Xor Sum Time Limit: 2000/1000 MS (Java/Others) ...

  2. [一本通学习笔记] 字典树与 0-1 Trie

    字典树中根到每个结点对应原串集合的一个前缀,这个前缀由路径上所有转移边对应的字母构成.我们可以对每个结点维护一些需要的信息,这样即可以去做很多事情. #10049. 「一本通 2.3 例 1」Phon ...

  3. 可持久化0-1 Trie 简介

    Trie树是字符串问题中应用极为广泛的一种数据结构,可以拓展出AC自动机.后缀字典树等实用数据结构. 然而在此我们考虑0-1 Trie的应用,即在序列最大异或问题中的应用. 这里的异或是指按位异或.按 ...

  4. 「模板」 01 Trie实现平衡树功能

    不想多说什么了.费空间,也不算太快,唯一的好处就是好写吧. #include <cstdio> #include <cstring> const int MAXN=100010 ...

  5. CSU 1216异或最大值 (0-1 trie树)

    Description 给定一些数,求这些数中两个数的异或值最大的那个值 Input 多组数据.第一行为数字个数n,1 <= n <= 10 ^ 5.接下来n行每行一个32位有符号非负整数 ...

  6. P4735 最大异或和 01 Trie

    题目描述 给定一个非负整数序列 \(\{a\}\),初始长度为\(n\). 有 \(m\) 个操作,有以下两种操作类型: \(A\ x\):添加操作,表示在序列末尾添加一个数 \(x\),序列的长度 ...

  7. 2015 CCC - 01 统计数对

    源:CNUOJ-0384 http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=354 题目分析:当时拿到这道题第一个想法就是排序后n^2暴 ...

  8. 【动态规划】XMU 1588 01序列计数

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1588 题目大意: 给n1个0和n2个1,连续的0不超过k1个,连续的1不超过k2个.问 ...

  9. poj 3764 The xor-longest Path (01 Trie)

    链接:http://poj.org/problem?id=3764 题面: The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K ...

随机推荐

  1. nodejs五子棋online游戏开发视频教程,客户端cocos creator js

    开发的游戏是五子棋online,网络版的,服务端部分和客户端部分都在这个教程里面,可以看一下目录! 服务器nodejs游戏开发教程 使用Nodejs开发网络服务器 游戏服务端 ,cocos creat ...

  2. [XLua]热更新四部曲视频教程+示例源码

    基于Unity2017 xLua是由腾讯维护的一个开源项目,xLua为Unity. .Net. Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用.自20 ...

  3. 如何选题?| 什么样的科学问题 | 研究项目才是有意义的?| scientific method

    搞科研,尤其是生命科学,经常会觉得自己做的东西是坨屎,没有任何意义. 在硕博的时候这种感觉会非常强烈,一个是自己思考能力不足:二是你的项目不是你设计的,不懂个中缘由,只执行的话就会很无聊,找不到意义感 ...

  4. H5网站接入支付宝的支付接口

    写本文章的目的是为了记录工作中遇到的问题,方便以后遇到可以迅速解决问题 H5手机网站接入支付宝的支付接口,推荐使用支付宝提供的SDK来快速开发 我使用的是SDK开发 引用命名空间 using Aop. ...

  5. 峰回路转的提权08r2服务器

    事前日下这个站的时候说实话,略微的蛋疼.其过程就不写了,就讲讲提权吧.可能图片有点暗.看看我写这篇文章的时候就知道了. 这个学校我好多同学在里面读书,就萌生了.日下这个站的想法. 拿到shell,理所 ...

  6. Spring cloud微服务安全实战-5-9实现基于session的SSO(Token有效期)

    token的有效期 会出现一种情况session有效期还没到.但是token过期了. 用户登陆着,但是token失效了 没法访问服务了. 刷新令牌要和clientId和ClientSecret一起用, ...

  7. 定时备份删除数据库sql

    1.备份数据库 mkdir -p /home/mysql/mysql_bak/ vi mysql_bak.sh #!/bin/bash #Shell Command For Backup MySQL ...

  8. 利用SynchronizationContext.Current在线程间同步上下文(转)

    https://blog.csdn.net/iloli/article/details/16859605 简而言之就是允许一个线程和另外一个线程进行通讯,SynchronizationContext在 ...

  9. AD 常用策略

    配置WSUS 配置NTPS 配置用户配置文件漫游 配置漫游区磁盘配额 配置修改本地管理员用户名 配置修改本地管理员密码 配置网络验证(提示是否联网错误) 配置允许开设永久共享 配置允许开设共享打印机 ...

  10. 【k8s label】对node添加删除label,并根据label筛选节点

    添加 kubectl label nodes kube-node label_name=label_value kubectl label nodes 1.1.1.1 label_name=label ...