三元组[01 Trie计数]
\(\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计数]的更多相关文章
- hdu 4825 Xor Sum (01 Trie)
		
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题面: Xor Sum Time Limit: 2000/1000 MS (Java/Others) ...
 - [一本通学习笔记] 字典树与 0-1 Trie
		
字典树中根到每个结点对应原串集合的一个前缀,这个前缀由路径上所有转移边对应的字母构成.我们可以对每个结点维护一些需要的信息,这样即可以去做很多事情. #10049. 「一本通 2.3 例 1」Phon ...
 - 可持久化0-1 Trie  简介
		
Trie树是字符串问题中应用极为广泛的一种数据结构,可以拓展出AC自动机.后缀字典树等实用数据结构. 然而在此我们考虑0-1 Trie的应用,即在序列最大异或问题中的应用. 这里的异或是指按位异或.按 ...
 - 「模板」 01 Trie实现平衡树功能
		
不想多说什么了.费空间,也不算太快,唯一的好处就是好写吧. #include <cstdio> #include <cstring> const int MAXN=100010 ...
 - CSU 1216异或最大值 (0-1 trie树)
		
Description 给定一些数,求这些数中两个数的异或值最大的那个值 Input 多组数据.第一行为数字个数n,1 <= n <= 10 ^ 5.接下来n行每行一个32位有符号非负整数 ...
 - P4735 最大异或和 01 Trie
		
题目描述 给定一个非负整数序列 \(\{a\}\),初始长度为\(n\). 有 \(m\) 个操作,有以下两种操作类型: \(A\ x\):添加操作,表示在序列末尾添加一个数 \(x\),序列的长度 ...
 - 2015 CCC - 01 统计数对
		
源:CNUOJ-0384 http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=354 题目分析:当时拿到这道题第一个想法就是排序后n^2暴 ...
 - 【动态规划】XMU 1588 01序列计数
		
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1588 题目大意: 给n1个0和n2个1,连续的0不超过k1个,连续的1不超过k2个.问 ...
 - poj  3764  The xor-longest Path  (01 Trie)
		
链接:http://poj.org/problem?id=3764 题面: The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K ...
 
随机推荐
- 英语语法 - 介词on/in/at与时间
			
介词滥用是中国学生的普遍缺点,主要是在语言学习的阶段没有人指正,形成有效的反馈,后面进入社会,就算别人发现你错了,也不会指正你,导致你一错再错. 看一篇教程,讲得不错.
 - Wamp 本地访问特别慢,原因在这
			
Wamp 本地访问特别慢.打开空的页面都要400ms,彻底疯了 什么localhost改为127.0.0.1 什么 清理日志缓存,都不好使, 重点在Xdebug,安装了Xdebug之后变慢 ...
 - Postman使用方法示例
 - 【Dart学习】--Dart之数组(List)的相关方法总结
			
一,初始化List 非固定长度list var testList = List(); print(testList.length);//输出0 固定长度List var testList2 = Lis ...
 - jsp、freemarker、velocity、thymeleaf
			
1.概述在java领域,表现层技术主要有三种, (1)jsp; (2)freemarker; (3)velocity; (4)thymeleaf; 2.jsp优点: 1.功能强大,可以写java代码 ...
 - 一秒解决--------No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
			
在打war包时候遇到错误: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.0:compile (d ...
 - python对 windows系统监控插件
			
在python编程的windows系统监控中,需要监控监控硬件信息需要两个模块:WMI 和 pypiwin32 .
 - window下安装docker
			
下载docker toolbox https://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ 1,.双击安装DockerTool ...
 - Python中random模块生成随机数详解
			
Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...
 - LeetCode_231. Power of Two
			
231. Power of Two Easy Given an integer, write a function to determine if it is a power of two. Exam ...