[CSP-S模拟测试]:Race(数学+Trie树)
题目描述
一年一度的运动会开始了。有$N$个选手参赛,第$i$个选手有一个能力值(保证$A[i]$两两不同),比赛一共进行了天。在第$j$天($0\leqslant j\leqslant 2^{m-1}$)的比赛中,第$i$个选手的得分为$A[i]\ xor\ j$,然后从大到小排名,排名为$x$($x$从$0$开始)的同学会获得的积分,你需要求出每个同学最后总的积分和$q[i]$模${10}^9+7$的结果$p[i]$。为了避免输出文件过大,你只要输出$p[i]$的异或和即可。
输入格式
第一行两个整数,分别代表$N,M$。
接下来一行$N$个整数,第$i$个数代表$A[i]$。
输出格式
一个整数代表答案。
样例
样例输入:
3 2
0 1 2
样例输出:
8
数据范围与提示
对于$10\%$的数据,$M\leqslant 5$。
对于$30\%$的数据,$N\leqslant 100$。
对于$50\%$的数据,$N\leqslant 1,000$。
对于$100\%$的数据,$N\leqslant 200,000,M\leqslant 30,A[i]<2^m$。
题解
考虑怎么求出$x$的答案。平方相当于是枚举两个人(可以相同),把这两个人同时排在$x$前面的天数计入答案。那么对于$x$,如果我们求出$f[i]$也就是能力值的二进制中第$i+1$到$M-1$位都和他相等且第$i$位不同的人有多少个,那么这些人是否排在他前面只由第$i$位确定,一共有$2^{(M-1)}$天,而且不需要从这些人中枚举两个人了,因为直接平方即可。我们只要枚举$i$和$j$,$f[i]$这些人和$f[j]$这些人同时排在他前面的天数为$2^{(M-2)}$,所以把$2\times f[i]\times f[j]\times 2^{(M-2)}$计入答案。具体实现有很多方法,可以用$trie$树实现。
时间复杂度:$\Theta(N)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,m;
int trie[10000000][2],cnt;
long long size[10000000];
long long ans;
void insert(int x)
{
int p=0;
for(int i=m-1;i>=0;i--)
{
int c=(x>>i)&1;
if(!trie[p][c])trie[p][c]=++cnt;
p=trie[p][c];
size[p]++;
}
}
void dfs(int x,long long sum,long long num)
{
if(trie[x][0])dfs(trie[x][0],(sum+(size[trie[x][1]]*size[trie[x][1]]%1000000007*(1<<m-1)%1000000007+size[trie[x][1]]*num%1000000007*(1<<m-1)%1000000007)%1000000007)%1000000007,num+size[trie[x][1]]);
if(trie[x][1])dfs(trie[x][1],(sum+(size[trie[x][0]]*size[trie[x][0]]%1000000007*(1<<m-1)%1000000007+size[trie[x][0]]*num%1000000007*(1<<m-1)%1000000007)%1000000007)%1000000007,num+size[trie[x][0]]);
if(!trie[x][0]&&!trie[x][1])ans^=sum;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int a;scanf("%d",&a);
insert(a);
}
dfs(0,0,0);
printf("%lld",ans);
return 0;
}
rp++
[CSP-S模拟测试]:Race(数学+Trie树)的更多相关文章
- [CSP-S模拟测试]:big(Trie树+贪心)
题目描述 你需要在$[0,2^n)$中选一个整数$x$,接着把$x$依次异或$m$个整数$a_1~a_m$.在你选出$x$后,你的对手需要选择恰好一个时刻(刚选完数时.异或一些数后或是最后),将$x$ ...
- [CSP-S模拟测试]:f(Trie树+二分答案+meet in middle+two pointers)
题目传送门(内部题67) 输入格式 第一行,三个整数$n$.$k$.$p$.第二行,$n$个自然数,表示$\{a_i\}$. 输出格式 输出一行,两个自然数,表示$f(res)$.$res$. 样例 ...
- [CSP-S模拟测试]:Weed(线段树)
题目描述 $duyege$的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹.为了查出真相,$duyege$准备修好电脑之后再进行一次金坷垃的模拟实验.电脑上面有若干层金坷垃,每次只能在上面撒上一层高度 ...
- 7.18 NOIP模拟测试5 星际旅行+砍树+超级树
T1 星际旅行 题意:n个点,m条边,无重边,有自环,要求经过m-2条边两次,2条边一次,问共有多少种本质不同的方案.本质不同:当且仅当至少存在一条边经过次数不同. 题解:考试的时候理解错题,以为他是 ...
- [CSP-S模拟测试]:光线追踪(线段树)
题目背景 初中时的乔猫试着组建了$NEWorld$开发组,可是不久之后却因为合作上的问题(和乔猫工程水平差,代码混乱的问题),开发组成员之间常常产生矛盾,关系越来越不如以前......一年下来,受到长 ...
- [CSP-S模拟测试]:椎(线段树维护区间最值和单调栈)
题目描述 虽不能至,心向往之. $Treap=Tree+Heap$ 椎$=$树$+$堆 小$\pi$学习了计算机科学中的数据结构$Treap$. 小$\pi$知道$Treap$指的是一种树. 小$\p ...
- [CSP-S模拟测试]:bird(线段树优化DP)
题目传送门(内部题89) 输入格式 第一行两个数$n$和$k$,分别表示小鸟的只数和$R$装弹时间.接下来$n$行,每行两个数$l,r$表示$n$只小鸟初始时的头和尾的$x$坐标. 输出格式 输出一个 ...
- [CSP-S模拟测试]:string(线段树)
题目描述 给定一个由小写字母组成的字符串$s$. 有$m$次操作,每次操作给定$3$个参数$l,r,x$. 如果$x=1$,将$s[l]~s[r]$升序排序: 如果$x=0$,将$s[l]~s[r]$ ...
- [CSP-S模拟测试]:Permutation(线段树+拓扑排序+贪心)
题目描述 你有一个长度为$n$的排列$P$与一个正整数$K$你可以进行如下操作若干次使得排列的字典序尽量小对于两个满足$|i−j|\geqslant K$且$|P_i−P_j|=1$的下标$i$与$j ...
随机推荐
- 让 Visio 2003/2007 同时开多个独立窗口
1. 打开 Visio 2003/2007 2. 点击菜单[工具] -> [选项]: 3. 在弹出的“选项” 对话框中选择“高级”选项页: 4. 去掉“在同一窗口中打开每一 ShapeSheet ...
- Emqtt集群搭建
1 Emqtt简单搭建 1.1 介绍:EMQ:EMQ 2.0,号称百万级开源MQTT消息服务器,基于Erlang/OTP语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源MQTT消息服务器 ...
- 批量更新:A表数据源 B表目标
update a set a.Title = b.Title from Table_A a ,Tbale_B b where a.ID_Table_B = b.ID
- redis可以做什么?
redis可以做什么? 1.缓存,毫无疑问这是Redis当今最为人熟知的使用场景.在提升服务器性能方面非常有效: 2.排行榜,如果使用传统的关系型数据库来做这个事儿,非常的麻烦,而利用Redis的So ...
- 【xinsir】githook之precommit分享
钩子类型 使用node编写githook,以pre-commit为例: 1.在项目下配置自动生成pre-commit文件,一般可以在启动项目的脚本下添加: modifyPreCommit: funct ...
- 【问题解决方案】Mathtype中丢失Mplugin.dll的问题
网络上搜索到的答案: Mathtype中丢失Mplugin.dll,把Mplugin.dll文件放到Mathtype安装根目录下就好了. 然而试过以后仍然不行 事实是: 如果下载的mathtype安装 ...
- RabbitMQ ——四种ExChange及完整示例
RabbitMQ常用的Exchange Type有fanout.direct.topic.headers这四种,下面分别进行介绍. 这四种类的exchange分别有以下一些属性,分别是: name:名 ...
- 01.Linux-CentOS系统网卡名称变动问题
方法一root登陆系统1.删除原来的配置信息[root@localhost ~]# rm -f /etc/sysconfig/network-scripts/ifcfg-eth0[root@local ...
- 02.LNMP架构-MySQL源码包编译部署详细步骤
操作系统:CentOS_Server_7.5_x64_1804.iso 部署组件:Cmake+Boost+MySQL 操作步骤: 一.安装依赖组件 [root@localhost ~]# yum -y ...
- Kvm--02 安装centos6系统 ,kvm磁盘管理
目录 1.安装一个CentOS6的系统的虚拟主机 2.虚拟机的备份 3.企业案例: 4.Kvm磁盘管理 1.安装一个CentOS6的系统的虚拟主机 #上传一个CenOS6系统的镜像到/opt目录下 [ ...