首页 > 其他分享 >[BZOJ4358]permu树上莫队

[BZOJ4358]permu树上莫队

时间:2024-04-22 16:46:23浏览次数:25  
标签:rt ch int permu len sj BZOJ4358 ls 莫队

先放代码 晚上补(争取)

#include<bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
typedef long long ll;
using namespace std;
inline int qr()
{
	char ch=getchar();int x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
#define qr qr()
const int Ratio=0;
const int N=100005;
const int maxi=INT_MAX;
int n,m;
int sq,c[N],bl[N],ans[N],sj[N];
struct rmm
{
	int l,r,id;
}q[N];
bool cmp(rmm a,rmm b)
{
	if(bl[a.l]!=bl[b.l])
		return bl[a.l]<bl[b.l];
	if(bl[a.l]&1)
		return a.r<b.r;
	return a.r>b.r;
}
struct rmmm
{
	int len,lm,rm,mm;
}t[N<<2];
namespace Acheron
{
	#define lid (rt<<1)
	#define rid (rt<<1|1) 
	void Apushup(int rt)
	{
		t[rt].lm=t[lid].lm;
		t[rt].rm=t[rid].rm;
		if(t[lid].lm==t[lid].len)
			t[rt].lm+=t[rid].lm;
		if(t[rid].rm==t[rid].len)
			t[rt].rm+=t[lid].rm;
		t[rt].mm=max({t[lid].mm,t[rid].mm,t[lid].rm+t[rid].lm});
	}
	void Abuild(int rt,int l,int r)
	{
		if(l==r)
		{
			t[rt].len=1;
			return;
		}
		int mid=(l+r)>>1;
		Abuild(lid,l,mid);
		Abuild(rid,mid+1,r);
		t[rt].len=t[lid].len+t[rid].len;
		return;
	}
	void Aadd(int rt,int l,int r,int x)
	{
		if(l==x&&r==x)
		{
			t[rt].lm=t[rt].rm=t[rt].mm=1;
			return;
		}
		int mid=(l+r)>>1;
		if(x<=mid)
			Aadd(lid,l,mid,x);
		else
			Aadd(rid,mid+1,r,x);
		Apushup(rt);
		return;
	}
	void Adel(int rt,int l,int r,int x)
	{
		if(l==x&&r==x)
		{
			t[rt].lm=t[rt].rm=t[rt].mm=0;
			return;
		}
		int mid=(l+r)>>1;
		if(x<=mid)
			Adel(lid,l,mid,x);
		else
			Adel(rid,mid+1,r,x);
		Apushup(rt);
		return;
	}
}
int main()
{
	n=qr,m=qr;
	sq=sqrt(n);
	fo(i,1,n)
		c[i]=qr,bl[i]=(i-1)/sq+1;
	Acheron::Abuild(1,1,n);
	fo(i,1,m)
		q[i].l=qr,q[i].r=qr,q[i].id=i;
	sort(q+1,q+1+m,cmp);
//	Acheron::Abuild(1,1,n);
	fo(i,q[1].l,q[1].r)
	{
		sj[c[i]]++;
		Acheron::Aadd(1,1,n,c[i]);
	}
	ans[q[1].id]=t[1].mm;
	int ls=q[1].l,rs=q[1].r;
	fo(i,2,m)
	{
		while(ls>q[i].l)
		{
			ls--,sj[c[ls]]++; 
			if(sj[c[ls]]==1)
				Acheron::Aadd(1,1,n,c[ls]);
		}
		while(ls<q[i].l)
		{
			sj[c[ls]]--;
			if(sj[c[ls]]==0)
				Acheron::Adel(1,1,n,c[ls]);
			ls++;
		}
		while(rs<q[i].r)
		{
			rs++,sj[c[rs]]++;
			if(sj[c[rs]]==1)
				Acheron::Aadd(1,1,n,c[rs]);
		}
		while(rs>q[i].r)
		{
			sj[c[rs]]--;
			if(sj[c[rs]]==0)
				Acheron::Adel(1,1,n,c[rs]);
			rs--;
		}
		ans[q[i].id]=t[1].mm;
	}
	fo(i,1,m)
		printf("%d\n",ans[i]);
	return Ratio;
}

标签:rt,ch,int,permu,len,sj,BZOJ4358,ls,莫队
From: https://www.cnblogs.com/Ratio-Yinyue1007/p/18150906

相关文章

  • C117 莫队配合 bitset P4688 [Ynoi2016] 掉进兔子洞
    视频链接:C117莫队配合bitsetP4688[Ynoi2016]掉进兔子洞_哔哩哔哩_bilibili   LuoguP4688[Ynoi2016]掉进兔子洞//莫队配合bitsetO(n*sqrt(n))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<bitset>usin......
  • 莫队
    莫队介绍利用分块进行处理的离线算法;时间复杂度普遍为\(O(n\sqrt{n})\);但会被卡实现思路对答案的查询在已知区间的情况下暴力寻找的目标区间的贡献;对于已知当前\([L,R]\)区间,一共有\(4\)种情况:加上当前区间左边一格的贡献:Add(--L);先将当前的下标......
  • 莫队
    简介莫队是一种离线求区间信息的算法,可以做到\(O((N+Q)\cdot\sqrt{N})\)。莫队中使用了分块的思想。首先考虑一个问题:给定一个长度为\(N\)序列\(A\)和\(Q\)次询问,每次询问查询区间\([X_i,Y_i]\)的和。(请先忘掉前缀和、线段树、树状数组什么的)比如以下数据:54322......
  • 莫队
    莫队是一种对于询问做转移的算法。对于可以离线,运算可逆的题目。如果按题目给的顺序操作,可以被以下数据hack11nn11nn11nn11nn...时间复杂度\(O(n^2)\)。我们可以通过某一些排序来降低时间复杂度。首先,把这个序列分成\(\sqrt{n}\)块,每一块按右......
  • C116 莫队二次离线 P4887 莫队二次离线
    视频链接:     LuoguP4887【模板】莫队二次离线(第十四分块(前体))//莫队二次离线O(n*sqrt(n)+n*C(k,14))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>usingnamespacestd;constintN=100005;......
  • 莫队
    查询区间每个数出现的个数,离线算法,O(nsqrt(n))一、普通莫队题目链接https://www.luogu.com.cn/problem/P2709题目大意题目代码#include<iostream>#include<algorithm>#include<cmath>#definelllonglongconstintN=5e4+5;usingnamespacestd;intn,m,k,block......
  • POI2008PER-Permutation
    POI#Year2008#数学#康拓展开#逆元如果是一个排列,根据康拓展开,答案为\[\sum\limits_{i=1}^nsum_{i}\times(n-i)!\]其中\[sum_{i}=\sum\limits_{j=i+1}^n[a_i>a_j]\]那么再加入了重复的数字之后,答案变为\[ \sum\limits_{i=1}^n\frac{sum_i\times(n-i)!}{\prod\limits_......
  • 莫队学习笔记
    目录普通莫队初遇——从暴力谈起困境——乱跑的指针优化——顺路而为之带修莫队参考资料普通莫队初遇——从暴力谈起我们通过一道例题来讨论普通莫队。题目链接。观察数据范围,一个很直接的想法是:开一个数组\(cnt\),\(cnt_i\)表示在询问的区间内数字\(i\)出现的次数。对于......
  • #莫队二次离线,根号分治#洛谷 5398 [Ynoi2018] GOSICK
    题目\(m\)组询问求\(\sum_{l\leqi,j\leqr}[a_i\bmoda_j==0],n,m,a_i\leq5\times10^5\)分析设\(f(l,r,x)\)表示\(i或j\in[1,x],i或j\in[l,r]\)时的答案,\(g_x\)表示\([1,x]\)的答案,根号的做法可以通过三秒由于涉及区间内的求值,需要在莫队的基础上二次离线,那......
  • C114 回滚莫队 歴史の研究
    视频链接:C114回滚莫队歴史の研究_哔哩哔哩_bilibili   LuoguAT_joisc2014_c歴史の研究//回滚莫队O(n^(3/2))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;#defineLLlonglongconstintN=1000005;......