ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制

2020-05-16 23:08:29  阅读:291  来源: 互联网

标签:16 cc ll 40 ww 牛客 ull 5.15 rep


LINK:小V的序列

考试的时候 没想到正解 于是自闭.

题意很简单 就是 给出一个序列a 每次询问一个x 问序列中是否存在y 使得x^y的二进制位位1的个数<=3.

容易想到 暴力枚举。

第一个想法是在trie树上乱跳 但是可以证明 和直接暴力无异.

暴力是 mlog^3的。

可以两头枚举 枚举n的生成一次 枚举m的变化两次 利用hash存前者.

复杂度降到mlog^2. 这个做法 时间和空间两个都爆。

正解:二进制数有 64位 只要求三个位置不同 那么 我们画出这三个位置 可以发现 三个位置中一定有两个位置之间相差16位.

利用16位二进制数来分段 那么相当于 n个数都均摊给2^16.

那么每一个2^16的地方 都最多有10个数字左右。

对于询问 我们也是分段然后查询即可。

由于数据基本上算是随机 所以这样做复杂度位均摊所以是正确的。

如果存在答案 可以证明 一定可以找到答案所在.

注意 输入64位整数的格式为%llu 常数写的不要太大.

const ll MAXN=1000010,INV=(mod+1)/2;
ll n,m;ull s;
ull a[MAXN];
vector<ll>g[1<<16][4];
ull G(ull x) 
{
    x^=x<<13;
    x^=x>>7;
    x^=x<<17;
    return x;
}
inline ll ksm(ll b,ll p)
{
    ll cnt=1;
    while(p)
    {
        if(p&1)cnt=(ll)cnt*b%mod;
        b=(ll)b*b%mod;p=p>>1;
    }
    return cnt;
}
inline ll pd(ll x,ull ww)
{
	ull cc=a[x]^ww;
	ll cnt=0;
	while(cc)
	{
		++cnt;
		cc-=cc&(-cc);
		if(cnt>3)return 0;
	}
	return 1;
}
signed main()
{
    //freopen("1.in","r",stdin);
    scanf("%lld%lld",&n,&m);scanf("%llu",&s);
    ull x=s;
	ll maxx=1<<16;--maxx;
    rep(0,n-1,i)
    {
		ull s=x;
		a[i]=x;
		rep(0,3,j)
		{
			ll ww=s&maxx;
			g[ww][j].pb(i);
			s=s>>16;
		}
		x=G(x);
    }
    ll cc=ksm(2,m-1);
    ll ans=0;
	rep(1,m,i)
	{
		ull x;
		scanf("%llu",&x);
		ull s=x;ll flag=0;
		rep(0,3,j)
		{
			ll ww=s&maxx;
			if(g[ww][j].size())
				rep(0,g[ww][j].size()-1,k)if(pd(g[ww][j][k],x)){flag=1;break;}
			s=s>>16;
			if(flag)break;
		}
		if(flag)ans=(ans+cc)%mod;
		cc=cc*INV%mod;
	}
    //rep(1,n-1,i)a[i]=G(a[i-1]);
    //rep(0,n-1,i)putl((ll)a[i]);
    putl(ans);
    return 0;
}

标签:16,cc,ll,40,ww,牛客,ull,5.15,rep
来源: https://www.cnblogs.com/chdy/p/12902673.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有