JZOJ 5352. 【NOIP2017提高A组模拟9.7】计数题
2024-09-08 19:41:48
题目
分析
考虑 \(kruskal\) 的过程
我们选边从高位开始
当前位为 \(0\) 的放一边,为 \(1\) 的放另一边
将 \(0\) 的建一棵字典树, \(1\) 的匹配
因为是异或,那就走相同值的位,算能匹配到的最小值的个数
和与方案数都可以在这里计算
\(Code\)
#include<cstdio>
using namespace std;
typedef long long LL;
const LL P = 1e9 + 7;
const int N = 100005;
int n , cnt , su , a[N] , c[N] , d[N] , ts[N * 30] , t[N * 30][2];
LL ans = 1;
LL fpow(LL x , LL y)
{
LL res = 1;
while (y)
{
if (y & 1) res = res * x % P;
y >>= 1 , x = x * x % P;
}
return res;
}
void insert(int x)
{
int u = 0 , ch;
for(register int i = 30; i >= 0; i--)
{
ch = (x >> i) & 1;
if (!t[u][ch]) t[u][ch] = ++cnt;
u = t[u][ch] , ts[u]++;
}
}
int find(int x)
{
int u = 0 , ch , res = 0;
for(register int i = 30; i >= 0; i--)
{
ch = (x >> i) & 1;
if (t[u][ch]) u = t[u][ch];
else u = t[u][ch ^ 1] , res = res + (1 << i);
}
su = ts[u];
return res;
}
LL solve(int l , int r , int w)
{
if (l >= r) return 0;
if (w == -1)
{
if (r - l - 1 > 0) ans = ans * fpow(r - l + 1 , r - l - 1) % P;
return 0;
}
int tl = 0 , tr = 0;
for(register int i = l; i <= r; i++)
if (a[i] & (1 << w)) d[++tr] = a[i];
else c[++tl] = a[i];
for(register int i = 1; i <= tl; i++) a[l + i - 1] = c[i];
for(register int i = 1; i <= tr; i++) a[l + tl - 1 + i] = d[i];
int tmp;
if (!tl || !tr) tmp = 0;
else
{
int num = 0 , f; tmp = 2147483647 , cnt = 0;
for(register int i = 1; i <= tl; i++) insert(c[i]);
for(register int i = 1; i <= tr; i++)
{
su = 0 , f = find(d[i]);
if (f < tmp) tmp = f , num = su;
else if (tmp == f) num += su;
}
ans = ans * num % P;
for(register int i = 0; i <= cnt; i++) ts[i] = t[i][0] = t[i][1] = 0;
}
return 1LL * tmp + solve(l , l + tl - 1 , w - 1) + solve(l + tl , r , w - 1);
}
int main()
{
freopen("jst.in" , "r" , stdin);
freopen("jst.out" , "w" , stdout);
scanf("%d" , &n);
for(register int i = 1; i <= n; i++) scanf("%d" , &a[i]);
printf("%lld\n" , solve(1 , n , 30));
printf("%lld" , ans);
}
最新文章
- 一段能导致火狐、谷歌Safari浏览器崩溃,甚至让iPhone重启的代码
- mysql对比表结构对比同步,sqlyog架构同步工具
- D类 E类地址
- VSTO之旅系列(四):创建Word解决方案
- 从XML文件乱码问题,探寻其背后的原理(转)
- 【Spring 核心】AOP 面向切面编程
- Effective Java 第三版——14.考虑实现Comparable接口
- 安装node.js和npm
- ELK 经典用法—企业自定义日志手机切割和mysql模块
- Delphi下DLL编程知识(转)
- 安卓系统启动脚本init.rc说明文件readme.txt翻译
- 使用AOP AspectJ 定义@Before,@After ,@Aroud后 执行两次
- pycharm运行Django发生AppRegistryNotReady: Apps aren&#39;t loaded yet.
- python 小爬虫爬取博客文章初体验
- citySelect省市区jQuery联动插件
- spring mvc开发过程中的乱码问题
- Leetcode刷题记录:构建最大数二叉树
- BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)
- node和yarn
- jquery 配合 jsp 实现 ajax 要注意的问题
热门文章
- 记录一次PyQt5内存泄漏的问题解决
- GO开发工具litelDE的安装与使用
- Kafka教程(三):原理及存储
- 一图看懂Hadoop中的MapReduce与Spark的区别:从单机数据系统到分布式数据系统经历了哪些?
- Velero 系列文章(二):使用 Helm 安装 Velero
- 快速入门JavaScript编程语言
- markdown语法使用
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(37)-掌握Fiddler中Fiddler Script用法,你会有多牛逼-下篇
- 【运维笔录】局域网实现HTTPS访问,只需Nginx + mkcert
- CentOS7.6搭建Hadoop2.7.2运行环境-三节点集群模式