【NOIP2017提高A组模拟9.7】JZOJ 计数题
【NOIP2017提高A组模拟9.7】JZOJ 计数题
题目
Description

Input

Output

Sample Input
5
2 2 3 4 5
Sample Output
8
6
Data Constraint

题解
题意
给出\(a[i]\),有一完全图,\(i\)与\(j\)之间的边的值为\(a[i] \oplus a[j]\)(\(\oplus\)为异或的意思)
求最小生成树及方案数
题解
科普一个东西,\(n\)个点的完全图的生成树个数是\(n^{n-2}\)
这个东西叫做凯莱定理,大家可以自行了解一下
100\(\%\)
看到异或,而且要最小,且\(a[i]\)二进制做多只有30位
想到可以按照最高位往下分治,分成当前这位是0和1的两堆,然后为了取值最小,那么这两堆只能连一条
那么就找到这两堆里面异或值最小的,这是\(trie\)应用的经典问题
然后分治一位一位往下
最后把所有最小值加一起,方案数乘起来即可
Code
#include<cmath>
#include<cstdio>
#include<algorithm>
#define mod 1000000007
using namespace std;
long long n,mx,num,ans,ans1,tot,a[1000001],er[31],c1[1000001],c2[1000001];
struct node
{
long long left,right,size;
}trie[400005];
long long read()
{
long long res=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch-'0'),ch=getchar();
return res;
}
void insert(long long x)
{
long long now=1;
++trie[now].size;
for (long long i=mx;i>=0;--i)
{
if (x&er[i])
{
if (trie[now].left==0) trie[now].left=++num,trie[num].left=trie[num].right=trie[num].size=0;
now=trie[now].left;
++trie[now].size;
}
else
{
if (trie[now].right==0) trie[now].right=++num,trie[num].left=trie[num].right=trie[num].size=0;
now=trie[now].right;
++trie[now].size;
}
}
}
long long calc(long long x)
{
long long now=1,s=0;
for (long long i=mx;i>=0;--i)
{
if (x&er[i])
{
if (trie[trie[now].left].size>0) now=trie[now].left;
else s+=er[i],now=trie[now].right;
}
else
{
if (trie[trie[now].right].size>0) now=trie[now].right;
else s+=er[i],now=trie[now].left;
}
}
tot=trie[now].size;
return s;
}
long long ksm(long long x,long long y)
{
long long res=1;
while (y)
{
if (y&1) res=res*x%mod;
x=x*x%mod;
y>>=1;
}
return res;
}
long long dg(long long l,long long r,long long d)
{
if (r<=l) return 1;
if (d<0) return ksm(r-l+1,r-l-1);
long long t1=0,t2=0;
for (long long i=l;i<=r;++i)
{
if (a[i]&er[d]) c1[++t1]=a[i];
else c2[++t2]=a[i];
}
for (long long i=1;i<=t1;++i)
a[l+i-1]=c1[i];
for (long long i=1;i<=t2;++i)
a[l+t1+i-1]=c2[i];
long long s1=dg(l,l+t1-1,d-1),s2=dg(l+t1,r,d-1);
long long s3=(s1*s2)%mod,s4=2147483647,s5=0;
if (t1==0||t2==0) return s3;
num=1;
trie[1].left=trie[1].right=trie[1].size=0;
for (long long i=1;i<=t1;++i)
insert(a[l+i-1]);
for (long long i=1;i<=t2;++i)
{
long long sum=calc(a[l+t1+i-1]);
if (sum<s4) s4=sum,s5=tot;
else if (sum==s4) s5=(s5+tot)%mod;
}
ans+=s4;
return (s3*s5)%mod;
}
int main()
{
freopen("jst.in","r",stdin);
freopen("jst.out","w",stdout);
n=read();
for (long long i=1;i<=n;++i)
a[i]=read(),mx=max(mx,a[i]);
mx=log2(mx);
er[0]=1;
for (long long i=1;i<=31;++i)
er[i]=er[i-1]*2%mod;
num=1;
ans1=dg(1,n,mx);
printf("%lld\n%lld\n",ans,ans1);
fclose(stdin);
fclose(stdout);
return 0;
}
【NOIP2017提高A组模拟9.7】JZOJ 计数题的更多相关文章
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- JZOJ 100029. 【NOIP2017提高A组模拟7.8】陪审团
100029. [NOIP2017提高A组模拟7.8]陪审团 Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limits Got ...
- JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线
5328. [NOIP2017提高A组模拟8.22]世界线 (File IO): input:worldline.in output:worldline.out Time Limits: 1500 m ...
- JZOJ 5329. 【NOIP2017提高A组模拟8.22】时间机器
5329. [NOIP2017提高A组模拟8.22]时间机器 (File IO): input:machine.in output:machine.out Time Limits: 2000 ms M ...
- JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)
5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)
5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)
5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...
- 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人
[NOIP2017提高A组模拟9.17]信仰是为了虚无之人 Description Input Output Sample Input 3 3 0 1 1 7 1 1 6 1 3 2 Sample O ...
- 【NOIP2017提高A组模拟9.17】猫
[NOIP2017提高A组模拟9.17]猫 题目 Description 信息组最近猫成灾了! 隔壁物理组也拿猫没办法. 信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数) ...
随机推荐
- redhat 7.4从openssh7.6离线升级openssh8.4p1解决方法
具体需求 这几天生产环境服务器又进行了安全扫描,每次都会报一下漏洞错误.虽然只有一个高危问题,但是每次看到ssh远程漏洞都很烧脑 "主要是里面坑太多了",闲话就不说了,今天我们来看 ...
- 通俗易懂浅谈理解ES6类this不同指向问题
1. class Btn{ //定义的一个类 constructor(id){ // constructor是一个构造函数,是一个默认方法,通过 new 命令创建对象实例时,自动调用该方法.一个类必须 ...
- SAM学习笔记&AC自动机复习
形势所迫,一个对字符串深恶痛绝的鸽子又来更新了. SAM 后缀自动机就是一个对于字符串所有后缀所建立起的自动机.一些优良的性质可以使其完成很多字符串的问题. 其核心主要在于每个节点的状态和$endpo ...
- 4、Python语法之变量
一 引入 我们学习Python语言是为了控制计算机.让计算机能够像人一样去工作,所以在Python这门语言中,所有语法存在的意义都是为了让计算机具备人的某一项技能,这句话是我们理解后续所有Python ...
- Magic Method
Python 的 Magic Method 在 Python 中,所有以 "__" 双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的 __init ...
- 15 CGI和WSGI
15 CGI和WSGI CGI是通用网关接口,是连接web服务器和应用程序的接口,用户通过CGI来获取动态数据或文件等. CGI程序是一个独立的程序,它可以用几乎所有语言来写,包括perl,c,lua ...
- 像用excel一样用pandas
1 说明 预计需要15min阅读此教材: 本教材仅讲述如何查看excel数据,筛选,排序,查找替换数据,不涉及excel中复杂的图形绘制及样式修改. 2 假设 假设,已经存在一个test.xlsx文件 ...
- ERP的主数据的操作与设计--开源软件诞生25
赤龙ERP主数据管理讲解--第25篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redr ...
- day89:luffy:使用Celery完成我的订单超时取消&Polyv视频加密播放
目录 1.我的订单超时取消 2.PoliV视频播放 1.我的订单超时取消 使用Celery完成超时取消功能 mycelery/order/tasks.py from mycelery.main imp ...
- 烧录时发生:permission denied:'/dev/ttyUSB0'问题的解决
在执行make flash的过程中出现错误: 解决办法: sudo chmod -R 777 /dev/ttyUSB0 这种设置在下次使用的,又会出现这种问题,还要重新设置 永久性的设置可以使用下面这 ...