社区讨论

性感回滚莫队在线求卡常

P8078[WC2022] 秃子酋长参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lv69xdrf
此快照首次捕获于
2024/04/19 14:12
2 年前
此快照最后确认于
2024/04/19 18:23
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;

const int N=5e5+7;
int bl[N],jl[N],a[N],n,m,blk,bln,L[N],R[N],nw,l,r,len,nid[N];
long long res,Ans[N];
struct Que{int x,y,id;}q[N];
pair<int,int> v[N],s[N]; 

int Abs(int x){return x>=0?x:-x;}
inline bool cmp(Que x,Que y){if(bl[x.x]==bl[y.x]) return x.y>y.y; else return x.x<y.x;}
inline int in()
{
	int x=0; char ch=getchar();
	while(ch>'9'||ch<'0') ch=getchar();
	while(ch<='9'&&ch>='0')
		x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return x;
}

inline long long gtans(int x,int y,bool fl)
{
	if(fl)
		for(register int i=1;i<=len;i++) jl[v[i].first]=0;
	len=0;
	for(register int i=1;i<=n;i++)
		if(nid[i]>=x&&nid[i]<=y) v[++len]=make_pair(i,nid[i]);
	if(fl)
		for(register int i=1;i<=len;i++) s[i]=make_pair(i-1,i+1),jl[v[i].first]=i;
	long long ans=0;
	for(register int i=1;i<len;i++) ans+=Abs(v[i+1].second-v[i].second);
//	for(int i=0;i<v.size();i++) cout<<v[i].second<<" ";
//	cout<<endl;
	return ans;
}

inline void did(int x)
{
	int dlt=0;
	x=jl[a[x]];
	s[s[x].first].second=s[x].second;
	s[s[x].second].first=s[x].first;
	if(s[x].first!=0) dlt=dlt-Abs(v[x].second-v[s[x].first].second);
	if(s[x].second!=len+1) dlt=dlt-Abs(v[x].second-v[s[x].second].second);
	if(s[x].first!=0&&s[x].second!=len+1)
		dlt=dlt+Abs(v[s[x].first].second-v[s[x].second].second);
	res+=1ll*dlt;
	return;
}

inline void undid(int x)
{
	x=jl[a[x]];
	s[s[x].first].second=x;
	s[s[x].second].first=x;
	return;
}

int main()
{
	n=in(); m=in();
	blk=900; bln=(n/blk+(n%blk==0?0:1));
	for(register int i=1;i<=bln;i++) L[i]=R[i-1]+1,R[i]=i*blk;
	R[bln]=n;
	for(register int i=1;i<=n;i++) a[i]=in(),nid[a[i]]=i,bl[i]=(i-1)/blk+1;
	for(register int i=1;i<=m;i++)
		q[i].x=in(),q[i].y=in(),q[i].id=i;
	sort(q+1,q+1+m,cmp); nw=1;
	for(register int i=1;i<=bln;i++)
	{
		if(bl[q[nw].x]!=i) continue;
		res=gtans(L[i],max(R[i],q[nw].y),1);
		l=L[i]; r=q[nw].y;
		while(nw<=m&&bl[q[nw].x]==i)
		{
			if(bl[q[nw].x]==bl[q[nw].y])
			{
				Ans[q[nw].id]=gtans(q[nw].x,q[nw].y,0);
				nw++; continue;
			}
			while(r>q[nw].y) did(r--);
			long long tmp=res;
			while(l<q[nw].x) did(l++);
			Ans[q[nw].id]=res;
			while(l>L[i]) undid(--l);
			res=tmp; nw++;
		}
	}
	for(register int i=1;i<=m;i++) printf("%lld\n",Ans[i]);
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...