分块60寄了求调,似乎和块长有关
查看原帖
分块60寄了求调,似乎和块长有关
740329
sunaohua楼主2023/4/6 10:35

不同块长WA的不同

#include<bits/stdc++.h>
using namespace std;
const int t=10005;
const int maxn=500005;
inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
		x=x*10+ch-'0',ch=getchar();
	return x*f;
}
struct node2 {
	int tanli[t];
	int l;
	int r;
} kuai[t];
int pos[maxn];
int b[maxn];
int fa[maxn],val[maxn];
int B;
vector<int> zz[maxn];
void dfs(int a) {
//	cout<<a<<endl;
	for(int i=0; i<zz[a].size(); i++) {
		int to=zz[a][i];
		val[to]=val[a]+1;
		fa[to]=fa[a];
		dfs(to);
	}
}
void add(int c,int k) {
	int p=pos[c];
	int num=c-B*(p-1);
	kuai[p].tanli[num]=k;
//	cout<<c<<" "<<k<<" "<<p<<endl;
	int ll=kuai[p].l,rr=kuai[p].r;
	for(int i=ll; i<=rr; i++) {
		while(!zz[i].empty())
			zz[i].pop_back();
		fa[i]=i;
		//	cout<<i<<" "<<fa[i]<<endl;
	}
	for(int i=ll; i<=rr; i++) {
		num=i-B*(p-1);
		if(i+kuai[p].tanli[num]<=rr) {
			zz[i+kuai[p].tanli[num]].push_back(i);
			fa[i]=i+kuai[p].tanli[num];
		}
	}
	for(int i=rr; i>=ll; i--) {
		if(fa[i]==i) {
			val[i]=0;
			dfs(fa[i]);
		}
	}
}
int main() {
	int n,tot=0;
	cin>>n;
	B=sqrt(n)+1;
//	cout<<B<<"*"<<endl;
	for(int i=1; i<=n; i+=B) {
		tot++;
		kuai[tot].l=i;
		kuai[tot].r=min(n,i+B-1);
		for(int j=i; j<=i+B-1; j++) {
			pos[j]=tot;
		}
	}
	for(int i=1; i<=n; i++) {
		//	cout<<i<<" "<<pos[i]<<endl;
		int k;
		k=read();
		int p=pos[i];
		kuai[p].tanli[i-B*(p-1)]=k;
		b[i]=k;
	}
	for(int i=1; i<=n; i++) {
		add(i,b[i]);
	}
	/*	for(int i=1; i<=n; i++) {
		int p=pos[i];
	//	cout<<kuai[p].tanli[i-(p-1)*B]<<endl;
		}*/
	int m;
	cin>>m;
	for(int i=1; i<=m; i++) {
		int opt;
		opt=read();
		if(opt==1) {
			int ans=0;
			int fir;
			fir=read();
			fir++;
			int p=pos[fir];
			//		cout<<"*"<<i<<" "<<fir<<endl;
			while(fir+kuai[p].tanli[fir]<=n) {
				p=pos[fir];
				//			cout<<p<<" "<<fir<<" "<<kuai[p].tanli[fir-B*(p-1)]<<endl;
				if(fa[fir]==fir) {
					fir+=kuai[p].tanli[fir-B*(p-1)];
					ans++;
				} else {
					ans+=val[fir];
					fir=fa[fir];
				}
			}
			cout<<ans<<endl;
			continue;
		}
		int c,k;
		c=read();
		k=read();
		add(c+1,k);
	}
	return 0;
}
2023/4/6 10:35
加载中...