【JZOJ 5352】 计数题
来源:互联网 发布:java小数点后两位 编辑:程序博客网 时间:2024/06/07 02:26
Description
N<=10^5,0<=ai<2^30
Analysis
看到异或考虑拆位
从高位往低位做,将第i位为0的点扔进集合S,为1的点扔进集合T
那么最优情况下,肯定是S, T分别连成树,然后S到T只连一条边
这样就转化成了
①子问题:S,T的最优方案,可以分治处理
②S到T连一条边权最小的边。这个可以用Trie实现
显然最多走log层,每层做的总数是nlogn次,所以复杂度为nlog^2
至于带标号n个不同的点的生成树个数为
Code
#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,b,a) for(int i=b;i>=a;i--)#define max(x,y) ((x)>(y)?(x):(y))#define min(x,y) ((x)<(y)?(x):(y))#define mset(a,x) memset(a,x,sizeof(a))using namespace std;typedef long long ll;char ch;void read(int &n){ n=0; for(ch=getchar();ch<'0' || ch>'9';ch=getchar()); for(;'0'<=ch && ch<='9';ch=getchar()) n=n*10+ch-'0';}const int N=1e5+4,mo=1e9+7,INF=2147483647,B=30;int n,tot,mn,cnt,_2[31],a[N],a0[N],a1[N];ll sum,ans;struct trie{ int x,s[2];}tr[31*N];ll qmi(ll x,ll n){ ll t=1; for(;n;n>>=1,x=x*x%mo) if(n&1) t=t*x%mo; return t;}void add(int x,int z){ for(int i=B,v=0;i>=0;i--,tr[v].x+=z) { bool p=(x&_2[i]); if(!tr[v].s[p]) tr[v].s[p]=++tot; v=tr[v].s[p]; }}void query(int x){ int t=0,v=0; for(int i=B;i>=0;i--) { bool p=(x&_2[i]); if(tr[tr[v].s[p]].x) v=tr[v].s[p]; else t+=_2[i],v=tr[v].s[p^1]; } if(t==mn) cnt+=tr[v].x; if(t<mn) mn=t,cnt=tr[v].x;}void divide(int d,int l,int r){ if(l>=r) return; if(d<0) { ans=ans*qmi(r-l+1,r-l+1-2)%mo; return; } int n0=0,n1=0; fo(i,l,r) if(a[i]&_2[d]) a1[++n1]=a[i];else a0[++n0]=a[i]; if(!n0 || !n1) { divide(d-1,l,r); return; } fo(i,1,n0) add(a[l+i-1]=a0[i],1); mn=INF,cnt=0; fo(i,1,n1) { a[l+n0+i-1]=a1[i]; int t=a1[i]; query(t); } sum+=mn,ans=ans*cnt%mo; fo(i,1,n0) add(a0[i],-1); divide(d-1,l,l+n0-1); divide(d-1,l+n0,r);}int main(){ freopen("jst.in","r",stdin); freopen("jst.out","w",stdout); _2[0]=1; fo(i,1,B) _2[i]=_2[i-1]<<1; read(n); fo(i,1,n) read(a[i]); ans=1; divide(B,1,n); printf("%lld\n%lld",sum,ans); return 0;}
阅读全文
0 0
- 【JZOJ 5352】 计数题
- 【JZOJ 4630】计数
- 【JZOJ 4630】计数
- JZOJ 4630 计数【NOIP2016提高A组模拟7.15】
- 菱形内的计数 jzoj 1404 模拟+递推
- 【Burnside引理】【Pólya计数法】【Pollard's Rho】【JZOJ 5457】 项链
- 计数排序题
- 计数
- 计数
- 计数
- 计数
- 计数
- 计数
- 计数
- 计数
- 【GDSOI 2017】【JZOJ 5107】中学生数据结构题
- 【GDOI 2017】【JZOJ 1502】小学生语文题
- JZOJ 7.10B组第三题 创世纪
- UVa11889
- Ubuntu 16.04 安装教程
- 创建docker自定义网桥 自定义网桥的配置 docker0
- Linux使用共享内存
- redis使用
- 【JZOJ 5352】 计数题
- soap简单对象访问协议
- Android Looper 架构 理解
- Anastasia and pebbles CodeForces
- MySQL和B数
- USACO 2015 Feb Gold 检查 (AC自动机+栈)
- php管理后台1
- js手机和邮箱正则校验
- ksh 把耗时的任务放到后台并监视其是否完成