关于分块20pts这件事 除了AC就tle
查看原帖
关于分块20pts这件事 除了AC就tle
984888
tiger_xwm楼主2024/11/26 20:15
#include<bits/stdc++.h>
#define int unsigned long long 
#define re register 
using namespace std;
const int inf=2*1e5+1;
int n,m;
int a[inf];
int partlen;
int partid[inf];
int partcnt[inf];
int partpos[inf];
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;
}
inline void write(int x){
    if(x<0){
        cout<<'-';
        x=-x;
    }
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
inline int get(int pos){
    int sum=0;
    while(pos<=n){
        sum+=partcnt[pos];
        pos=partpos[pos];
    }
    return sum;
}
inline void change(int position,int k){
    a[position]=k;
    int l=partid[position]*partlen-partlen+1;
    int r=partid[position]*partlen;
    for(int i=l;i<=position;i++){
		int cnt=0;
		int pos=i;
		while(pos<=r){
			cnt++;
			pos+=a[pos];
		}
        partcnt[i]=cnt;
        partpos[i]=pos;
    }
}
signed main(){
	n=read();
    partlen=sqrt(n);
	for(int i=1;i<=n;i++){
		a[i]=read();
		partid[i]=ceil(i*1.0/partlen);
	}
    int cnt,pos;
	for(int i=1;i<=n;i++){ 
		cnt=0;
		pos=i;
        int r=partid[i]*partlen;
		while(pos<=r){
			cnt++;
			pos+=a[pos];
		}
        partcnt[i]=cnt;
        partpos[i]=pos;
	}
    m=read();
    for(int f=1,opt,pos,k;f<=m;f++){
        opt=read(),pos=read();
        if(opt==1) {
            write(get(pos+1));
            cout<<endl;
        }
        if(opt==2){
            k=read();
            change(pos+1,k);
        }
    }
	return 0;
}
2024/11/26 20:15
加载中...