首页 > 其他分享 >P10690 Fotile 模拟赛 L 题解

P10690 Fotile 模拟赛 L 题解

时间:2024-08-24 14:15:22浏览次数:6  
标签:ch Fotile int 题解 P10690 tree 12010 root sum

题目传送门

前置知识

可持久化字典树 | 分块思想

解法

考虑分块预处理整块的答案,散块直接暴力。

设 \(f_{i,j}\) 表示以 \(i\) 所在的块的左端点为左端点,\(j\) 为右端点的最大异或和,可持久化 01-Trie 维护即可。

  • 本题中这种写法比处理整块到整块的答案更容易处理些。

整块的答案直接继承,枚举散块内的点判断即可。

理论块长取 \(\frac{n\sqrt{m \log_{2}{V}}}{m}\),但实测取 \(176\) 最快。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
struct PDS_Trie
{
	int root[12010],rt_sum=0;
	struct Trie
	{
		int cnt,ch[2];
	}tree[12010*40];
	int build()
	{
		rt_sum++;
		return rt_sum;
	}
	void insert(int pre,int &rt,int s)
	{
		rt=build();
		int p=rt,q=pre;
		tree[p].cnt=tree[q].cnt+1;
		for(int i=31;i>=0;i--)
		{
			for(int j=0;j<=1;j++)
			{
				tree[p].ch[j]=tree[q].ch[j];
			}
			tree[p].ch[(s>>i)&1]=build();
			p=tree[p].ch[(s>>i)&1];
			q=tree[q].ch[(s>>i)&1];
			tree[p].cnt=tree[q].cnt+1;
		}
	}
	int query(int rt1,int rt2,int s)
	{
		int ans=0;
		for(int i=31;i>=0;i--)
		{
			if(tree[rt2].ch[((s>>i)&1)^1]-tree[rt1].ch[((s>>i)&1)^1]>=1)
			{
				ans|=(1<<i);
				rt1=tree[rt1].ch[((s>>i)&1)^1];
				rt2=tree[rt2].ch[((s>>i)&1)^1];
			}
			else
			{
				rt1=tree[rt1].ch[(s>>i)&1];
				rt2=tree[rt2].ch[(s>>i)&1];
			}
		}
		return ans;
	}
	int ask(int l,int r,int s)
	{
		l++;
		r++;
		return query(root[l-1],root[r],s);
	}
}T;
int L[12010],R[12010],pos[12010],a[12010],sum[12010],f[900][12010],klen,ksum;
void init(int n,int m)
{
	klen=n*sqrt(m*32)/m+1;
	ksum=n/klen;
	for(int i=1;i<=ksum;i++)
	{
		L[i]=R[i-1]+1;
		R[i]=R[i-1]+klen;
	}
	if(R[ksum]<n)
	{
		ksum++;
		L[ksum]=R[ksum-1]+1;
		R[ksum]=n;
	}
	for(int i=1;i<=ksum;i++)
	{
		for(int j=L[i];j<=R[i];j++)
		{
			pos[j]=i;
		}
		for(int j=L[i];j<=n;j++)
		{
			f[i][j]=max(f[i][j-1],T.ask(L[i],j,sum[j]));
		}
	}
}
int query(int l,int r)
{
	int ans=0;
	if(pos[l]==pos[r])
	{
		for(int i=l;i<=r;i++)
		{
			ans=max(ans,T.ask(l,r,sum[i]));
		}
	}
	else
	{
		ans=f[pos[l]+1][r];
		for(int i=l;i<=R[pos[l]];i++)
		{
			ans=max(ans,T.ask(l,r,sum[i]));
		}
	}
	return ans;
}
int main()
{
	int n,m,ans=0,pos=1,l,r,i;
	cin>>n>>m;
	T.insert(T.root[0],T.root[1],0);
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
		sum[i]=sum[i-1]^a[i];
		pos++;
		T.insert(T.root[pos-1],T.root[pos],sum[i]);
	}
	init(n,m);
	for(i=1;i<=m;i++)
	{
		cin>>l>>r;
		l=(l%n+ans%n)%n+1;
		r=(r%n+ans%n)%n+1;
		if(l>r)
		{
			swap(l,r);
		}
		ans=query(l-1,r);
		cout<<ans<<endl;
	}
	return 0;
}

标签:ch,Fotile,int,题解,P10690,tree,12010,root,sum
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18377715

相关文章

  • 讨论TableLayoutPanel加载缓慢和闪烁问题解决方案
    WinForm加载多个自定义控件时,会出现很严重的闪烁问题,很卡,一块一块的加载(像打开网页时,网络很卡的那种感觉)简直没法忍受。在网上搜索了好久,网上大部分的方法是一下4种,但是都不能有效的解决问题。1、将DoubleBuffered设置true,用双缓存处理Form界面内容加载,可以提高页面显......
  • AtCoder Beginner Contest 367 A ~ F(无D题)题解
    AtCoderBeginnerContest367A~F(̸\notD)几天前就已经vp过了,但是忘写题解了今天才想起来痛,早知道这么简单,我就不在家里摆烂了A.ShoutEveryday罚了好几发,我打比......
  • CF1326F2 Wise Men (Hard Version) 题解
    题目链接点击打开链接题目解法挺难的。可能一步一步推下来也没那么复杂(?基本copytzc_wk的题解/bx肯定不能像\(F1\)用普通的状压求,一个技巧是容斥考虑令\(f_S\)表示\(S\)中为\(1\)的位置\(p_i\)和\(p_{i+1}\)必须认识,为\(0\)的位置随便\(f\)数组相当于答案......
  • P6348 [PA2011] Journeys 题解
    Description一个星球上有\(n\)个国家和许多双向道路,国家用\(1\simn\)编号。但是道路实在太多了,不能用通常的方法表示。于是我们以如下方式表示道路:\((a,b),(c,d)\)表示,对于任意两个国家\(x,y\),如果\(a\lex\leb,c\ley\led\),那么在\(x,y\)之间有一条道路。首都位于......
  • 2018年安徽省赛小学组题解
    T1:移动石子(stone)题目描述期待已久的“清明”假期终于到了。清明节是中华民族几千年来留下的优良传统,它有利于弘扬孝道亲情,唤醒家庭共同记忆,促进家庭成员乃至民族的凝聚力和认同感。小学生卡卡西非常高兴,因为清明前后正是踏青的好时光,他终于可以和小伙伴们一起出去踏青了!然而,天......
  • CF1514D Cut and Stick 题解
    题目传送门前置知识可持久化线段树解法若区间内不存在绝对众数,直接保持这一段即可。若存在绝对众数,贪心地想肯定要尽可能地把其分开还要限制出其他数使其不成为绝对众数。容易发现设绝对众数出现次数为\(cnt\),取\(cnt-1\)个其他数和绝对众数配对最优。但可能其他数不够\(......
  • 题解:P10906 [蓝桥杯 2024 国 B] 合法密码
    本来以为字符串多大,结果就这点,直接暴力。枚举起始点,对于每个起始点枚举后面\(8\sim16\)位有没有能用的即可。最后答案为\(400\)。附:计算代码枚举代码如下:for(inti=0;i<n;++i){for(intlength=8;length<=16;++length){if(i......
  • 题解:P10903 [蓝桥杯 2024 省 C] 商品库存管理
    题目大意有一个初始化为\(0\)的长度为\(n\)的序列,现有\(m\)个操作,每次将区间\([L,R]\)中的数量加\(1\),求如果不做某个操作将会有多少个数量为\(0\)的量。解题思路当看见这句话时就想到了差分,这题我们可以使用差分先处理将所有的操作执行后的数组,然后在算出如果减......
  • P10404 「XSOI-R1」原神数 题解
    一篇题解需要一张头图。容易发现超过十位的数都不是原神数,因为只有十个数字,不可能保证十一个位置互不相同。同时恰好十位的数也不可能是原神数,因为数位互不相同的十位数的数位和为\(45\),被\(3\)整除,一定是\(3\)的倍数。于是把原神数的范围缩小到\([1,10^9)\)。显然不......
  • P10528 [XJTUPC2024] 崩坏:星穹铁道 题解
    求方案数,分多种情况,不难想到DP。设\(dp_{i,j}\)表示已经行动\(i\)次,剩余战技点个数为\(j\)的方案数,容易得到以下转移方程。\(a_i=1\)时,有\[dp_{i,j}=\begin{cases}0,&j=0,\\dp_{i-1,j-1},&1\leqslantj\leqslant4,\\dp_{i-1,j-1}+dp_{i......