zoukankan      html  css  js  c++  java
  • [提高组集训2021] 温故而知新

    一、题目

    (n) 堆石子,第 (i) 堆石子有 (a_i) 个,当前取石子的人可以任取一堆还没有取完的石子,从中取 ([1,x]) 个。

    对于所有 (xin[1,n]),你都需要告诉是先手必胜还是后手必胜。

    (nleq 5cdot 10^5)

    二、解法

    利用 ( t sg) 函数,把题目做一个简单的转化:

    [forall xin[1,n],sg=oplus_{i=1}^n a_imod (x+1) ]

    根据套路,可以用调和级数的复杂度来优化,我们枚举 (x) 和左端点 (i),那么 ([i,i+x]) 这一段的模运算可以转化成减去 (x)问题变成了求一个区间的异或值,所有元素从其左端点开始

    复杂的区间问题考虑倍增,设 (f[i][j]) 表示从 (i) 开始走 (2^j) 步的异或和,转移:

    [f[i][j]=f[i][j-1]oplus f[i+2^{j-1}][j-1] ]

    显然这个转移是错的,因为后面那一段全部少加了一个 (2^{j-1}),但考虑到后面的元素值都小于 (2^{j-1}),所以我们只需要考察后面那一段的奇偶性就可以知道需不需要添上这样一个 (2^{j-1})

    询问的时候也是类似的思路,考虑少算的那个 (2^i) 即可,时间复杂度 (O(nlog^2n ))

    三、总结

    奇怪区间问题考虑倍增!

    #pragma GCC optimize(2)
    #include <cstdio>
    #include <iostream>
    using namespace std;
    const int M = 500005;
    #define p putchar
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,m,a[M],f[M][20],g[M][20];
    int work(int l,int r)
    {
    	int res=0,nw=0;
    	for(int i=19;i>=0;i--)
    	{
    		if(l+(1<<i)-1>r) continue;
    		res^=f[l][i];l+=(1<<i);
    		if(a[r]^a[l-1]) res^=(1<<i);
    	}
    	return res;
    }
    int main()
    {
    	freopen("stone.in","r",stdin);
    	freopen("stone.out","w",stdout);
    	n=read();
    	for(int i=1;i<=n;i++)
    		a[read()]^=1;
    	for(int i=1;i<=n;i++)
    		a[i]^=a[i-1];
    	for(int j=1;(1<<j)<=n+1;j++)
    		for(int i=0;i+(1<<j)-1<=n;i++)
    		{
    			f[i][j]=f[i][j-1]^f[i+(1<<j-1)][j-1];
    			if(a[i+(1<<j)-1]^a[i+(1<<j-1)-1])
    				f[i][j]^=(1<<j-1);
    		}
    	for(int i=2;i<=n+1;i++)
    	{
    		int ans=0;
    		for(int j=0;j<n;j+=i)
    			ans^=work(j,min(n,i+j-1));
    		if(ans) p('A'),p('l'),p('i'),p('c'),p('e'),p(' ');
    		else p('B'),p('o'),p('b'),p(' ');
    	}
    }
    
  • 相关阅读:
    微服务网关常用限流算法
    微服务网关zuul介绍
    Nginx实现微服务网关的简单介绍
    11.9-编写操作者
    11.5-编写程序
    11.3-学习操作者文档
    11.2-LV面向对象编程视频学习及周五与老师交流总结
    10.29-基于LabVIEW的分布式集群机器人控制系统
    10.27-运用操作者框架架设控制中心软件架构
    5.24-29离线解析问题
  • 原文地址:https://www.cnblogs.com/C202044zxy/p/15369329.html
Copyright © 2011-2022 走看看