社区讨论

分块0pts 求条 玄2关

P13982数列分块入门 7参与者 2已保存回复 3

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mj79wwgn
此快照首次捕获于
2025/12/15 22:53
2 个月前
此快照最后确认于
2025/12/19 12:10
2 个月前
查看原帖

record

CPP
#include<bits/stdc++.h>
#define int long long
#define fast register int

using namespace std;

const int N=3e6+100,P=10007;

int n,m;
int a[N];
int t;

int L[N],R[N],pos[N],add[N],b[N],val[N],mul[N];

inline void update(int lazy,int x,int y,int v) {
	int p=pos[x],q=pos[y];
	if (lazy==0){
		if (p==q) {
			for (fast i=x; i<=y; i++) {a[i]=((a[i]%P+v%P)%P+P)%P;}
			return ;
		}
		for (fast i=p+1; i<=q-1; i++) add[i]=((add[i]%P+v%P)%P+P)%P;
		
		for (fast i=x; i<=R[p]; i++) {a[i]=((a[i]%P+v%P)%P+P)%P;}
		
		for (fast i=L[q]; i<=y; i++) {a[i]=((a[i]%P+v%P)%P+P)%P;}
	}
	if (lazy==1){
		if (p==q) {
			for (fast i=x; i<=y; i++) {a[i]=((a[i]%P*v%P)%P+P)%P;}
			return ;
		}
		for (fast i=p+1; i<=q-1; i++) add[i]=((add[i]%P*v%P)%P+P)%P,mul[i]=((mul[i]%P*v%P)%P+P)%P;
		
		for (fast i=x; i<=R[p]; i++) {a[i]=((a[i]%P*v%P)%P+P)%P;}
		
		for (fast i=L[q]; i<=y; i++) {a[i]=((a[i]%P*v%P)%P+P)%P;}
	}
}

inline int query(int x){
	int p=pos[x];
	return ((a[x]%P*mul[p]%P+add[p]%P)%P+P)%P;
}

signed main() {
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
//	freopen("a3.in","r",stdin);
	
	cin>>n;
	
	for (fast i=1;i<=n*10;i++) mul[i]=1;
	
	t=sqrt(n);  
	
	for (fast i=1; i<=n; i++) {
		cin>>a[i];
	}
	
	for (fast i=1; i<=t; i++) {
		L[i]=(i-1)*t+1;
		R[i]=i*t;
		for (fast j=L[i]; j<=R[i]; j++) pos[j]=i;
	}
	
	if (R[t]<n) {
		t++;
		L[t]=R[t-1]+1;
		R[t]=n;
		for (fast i=L[t]; i<=R[t]; i++) pos[i]=t;
	}
	
	int qwq=n;
	
	while (qwq--) {
		int opt,x,y,w;
		cin>>opt>>x>>y>>w;
		if (opt==0) {
			update(0,x,y,w);
		} 
		if (opt==1){
			update(1,x,y,w);
		} 
		if (opt==2){
			cout<<query(y)<<"\n";
		}
	}
	
	return !!!("風雨中這點痛算什麽");
}
/*

5
1 12 1 1 1
0 1 2 1
0 1 2 1
0 1 2 1
0 1 5 1
1 1 5 2


*/

回复

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

正在加载回复...