首页 > 其他分享 >[BZOJ2741][FOTILE模拟赛] L 题解

[BZOJ2741][FOTILE模拟赛] L 题解

时间:2024-12-24 15:19:33浏览次数:4  
标签:rt ch FOTILE int 题解 la add BZOJ2741 id

相当好的题目,虽然和我前几天出的题重了qwq

\(lmx\) 是我们的红太阳,没有他我们就会死!!!


暴力枚举一个端点,然后用可持久化 \(01\ Trie\) 或者离线 \(Trie\)(当然这题用不了,但不强制在线的话是可以的)得到答案。时间复杂度 \(O(nm\log n)\),过不了,考虑优化。

红太阳 \(lmx\) 曾经说过:当你遇到任何一个数据结构不好处理的问题是,就可以使用分块。于是设块长为 \(k\),\(as_{i,j}\) 表示以第 \(i\) 到 \(j\times k-k+1\) 个点为左端点,以第 \(j\) 个块内的点作为右端点的区间最大异或和,\(xm_i\) 表示第 \(i\) 个块内部的点作为左右端点的区间最大异或和。

\(as_{i,j}\) 可以通过可持久化 \(Trie\ +\) 后缀最大值的方法求得,\(xm_i\) 直接枚举端点。预处理时间复杂度 \(O(\frac{n^2\log n}k)\)。

询问的时候边角用处理 \(xm_i\) 的方法处理(当然也可以预处理),整块直接调用 \(as_{l,i}\) 和 \(xm_i\) 即可。询问时间复杂度 \(O(mk\log n)\),预处理的话是 \(O(mk)\)。

容易发现 \(k=\sqrt n\) 时相对优秀,所以时间复杂度为 \(O((n+m)\sqrt n\log n)\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=12005,M=5e5+5,K=205;
int n,m,sm[N],rt[N],ch[M][2];
int kl,as[N][K],xm[K],la,tot;
void add(int &x,int y,int v,int id){
	if(!x) x=++tot;
	if(id<0) return;
	int c=((v>>id)&1);
	ch[x][c^1]=ch[y][c^1];
	add(ch[x][c],ch[y][c],v,id-1);
}int ans(int x,int y,int v,int id){
	if(id<0) return 0;
	int c=1-((v>>id)&1);
	if(ch[x][c]==ch[y][c])
		return ans(ch[x][c^1],ch[y][c^1],v,id-1);
	return (1ll<<id)+ans(ch[x][c],ch[y][c],v,id-1);
}int lt(int x){return min(x*kl,n);}
int ft(int x){return x*kl-kl+1;}
int idx(int x){return (x-1)/kl+1;}
void init(int id,int m){
	int fs=rt[m],ls=rt[lt(id)+1];
	for(int i=m;i;i--)
		as[i][id]=ans(fs,ls,sm[i-1],35);
	for(int i=m;i;i--)
		as[i][id]=max(as[i][id],as[i+1][id]);
	for(int i=m;i<=lt(id);i++)
		xm[id]=max(xm[id],ans(rt[m-1],rt[i],sm[i],35));
}int maxn(int l,int r){
	int lk=idx(l),rk=idx(r),re=0;
	if(lk==rk){
		for(int i=l;i<=r;i++)
			re=max(re,ans(rt[l-1],rt[i],sm[i],35));
		return re;
	}for(int i=l;i<=lt(lk);i++)
		re=max(re,ans(rt[l-1],rt[i],sm[i],35));
	for(int i=lk+1;i<rk;i++) re=max({re,as[l][i],xm[i]});
	for(int i=ft(rk);i<=r;i++)
		re=max(re,ans(rt[l-1],rt[i],sm[i],35));
	return re;
}signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m,kl=sqrt(n);
	add(rt[0],0,0,35),add(rt[1],rt[0],0,35);
	for(int i=1;i<=n;i++){
		cin>>sm[i],sm[i]^=sm[i-1];
		add(rt[i+1],rt[i],sm[i],35);
	}for(int j=1;j<=n;j+=kl) init(idx(j),j);
	while(m--){
		int x,y;cin>>x>>y,x=x%n+n,y=y%n+n;
		int l=min((x+la)%n+1,(y+la)%n+1);
		int r=max((x+la)%n+1,(y+la)%n+1);
		la=maxn(l,r),cout<<la<<"\n";
	}return 0;
}

标签:rt,ch,FOTILE,int,题解,la,add,BZOJ2741,id
From: https://www.cnblogs.com/chang-an-22-lyh/p/18627765/bzoj2741-fotile_l-tj

相关文章

  • umount: /xxx: target is busy问题解决
    在卸载文件系统的时候,提示umount:/tqls_system:targetisbusy,表示挂载的文件系统正在被使用。要卸载文件系统,必须结束使用文件或者目录的进程`fuser`命令用于查看使用特定文件或者文件系统的进程ID主要参数如下:```-mNAME,--mountNAME NAMEspecifiesafileonamou......
  • USACO24DEC Cake Game S 题解 [ 黄 ] [ 前缀和 ] [ adhoc ]
    CakeGame:小清新前缀和题,但是我场上想了半天优先队列贪心假完了/ll/ll/ll。观察本题有三个重要的结论,我们依次进行观察。不难发现,第二个牛一定会拿\(\frac{n}{2}-1\)个蛋糕走。同时它拿走的蛋糕一定是左边一段、右边一段。如果它要使自己的分数最大化,那么显然就是要将左边和......
  • CF2048D 题解
    提供一种非常naive且暴力的思路。小于等于Kevin的选手没有任何贡献,扣掉。我们发现,我们如果按轮次一个个填充这一堆比赛,实际上是可以确定一个(可能的)最优填充次序的。先填Kevin会做的。这些题目不影响排名。再按\(b_i\)从大到小依次填充。这样是最优的,因为\(b_i\)越小......
  • ZZJCACM个人训练赛23题解
    原题链接Ahttps://codeforces.com/contest/1999/problem/A800Bhttps://qoj.ac/contest/1794/problem/9310Chttps://codeforces.com/problemset/problem/2008/D1100Dhttps://qoj.ac/contest/1485/problem/8081Ehttps://codeforces.com/contest/2002/problem/B......
  • 第36次ccf-csp题解(思维)
    比赛链接https://sim.csp.thusaac.com/contest/36/home 比赛感受这会刚打完上海icpc,比起区域赛的题,这个简单太多了。感受还不错,写的很顺手。除了第3题,其他3题都是一发过。刷题得长期刷。      A题移动 题意:f:y+1; b:y-1; ......
  • 期望问题+ybt题解
    算法理解对于随机变量\(X\),有\(n\)个可能的取值,取值为\(x_i\)有\(P(x_i)\)的概率,则它的数学期望则为\(E(X)=\sum_{i=1}^nx_iP(x_i)\)性质其中期望的线性限制最重要,它可以将两个完全独立的期望拆分开来单独计算,详见例题T1:首先我们观察有\(n\)道题,我们根据期望的线......
  • 题解:CF2048F Kevin and Math Class
    Problemstatement给定长度为\(n\)的数组\(a,b\),每次操作可以任意选择一个区间\([l,r]\),记\(x=\displaystyle\min_{l\leqi\leqr}b_i\),然后\(\foralla_i(i\in[l,r]),a_i\leftarrow\lfloor{\frac{a_i}{x}}\rfloor\),求最终使得\(a_i\)均变为\(1\)的最小操作次......
  • 题解:P11411 兰奇的卡牌游戏
    题解:P11411兰奇的卡牌游戏今天来讲一个超级缝合题目,所以要先讲一些前置。前置知识\(1\)——单调栈[USACO06NOV]BadHairDayS题目入口题目描述农夫约翰有\(N\)头奶牛正在过乱头发节。每一头牛都站在同一排面朝右,它们被从左到右依次编号为\(1,2,\cdots,N\)。编号......
  • 2024年“华为杯”天津大学程序设计竞赛(新生赛)个人题解
    A.谁来自智算学部模拟#include<bits/stdc++.h>#defineintlonglong#definepiipiar<int,int>#definedbdoubleusingnamespacestd;intans[5];voidsolve(){ intn;cin>>n; while(n--){ stringstr;cin>>str; if(str.substr(4,......
  • AT_keyence2019_e Connecting Cities 题解
    题目传送门前置知识Boruvka算法解法考虑Boruvka算法。拆掉绝对值后得到\(a_{i}+id,a_{i}-id,a_{j}+id,a_{j}-id\)四个式子。vector启发式合并辅助线段树查询的常数过大,无法通过。上述做法的常数在于一条边会被计算两次,考虑优化。不妨直接钦定向前连、向后连的贡献,顺......