蒟蒻玄关求助,线段树板子没过样例
查看原帖
蒟蒻玄关求助,线段树板子没过样例
723205
xjsmsms楼主2024/12/3 17:10
#include <bits/stdc++.h>
#define lc (x<<1)
#define rc (x<<1|1)
#define mid ((l+r)>>1)
#define DB double
#define rep(i,a,n) for(register int i = (a);i<=(n);++i)
#define ll long long 
#define debug "Here!!!->Debug::"
using namespace std;

template<typename T>inline void read(T &x){
	char c = getchar();
	short int t = 1;x = 0;
	for(;!isdigit(c);c = getchar())if(c=='-')t=-1;
	for(;isdigit(c);c = getchar())x = (x<<1) + (x<<3) + (c^48);
	x*=t;
}
template<typename T>inline void write(T x){
	if(x<0){
		x = -x;
		putchar('-');
	}
	if(x>=10){
		write(x/10);
	}
	putchar(x%10+'0');
}
const int N = 1e5+10;
const int INF = 2147483647;
const int MOD = 1e9+7;

struct node{
	int sum;
	int sum1;
}tree[N<<2];
int n = 0,m = 0,a[N],inv[N];
void pushup(int x){
	tree[x].sum = (tree[x].sum+tree[x].sum)%MOD;
	
	tree[x].sum1 = (tree[x].sum1 + tree[x].sum1)%MOD;
}
void build(int x,int l,int r){
	if(l == r){
		tree[x].sum = a[l]%MOD;
		tree[x].sum1 = a[l]*a[l]%MOD;
	}else{
		build(lc,l,mid);
		build(rc,mid+1,r);
		pushup(x);
	}
}

void update(int x,int l,int r,int from,int to,int k){
	if(l>=from&&r<=to){
		tree[x].sum = k%MOD;
//		cout <<debug<<tree[x].sum<<endl;
		tree[x].sum1 = k*k%MOD;
	}else{
		if(mid>=from){
			update(lc,l,mid,from,to,k);
		}
		if(mid<to){
			update(rc,mid+1,r,from,to,k);
		}
		pushup(x);
	}
}
int query1(int x,int l,int r,int from,int to){
	if(l>=from&&r<=to){
		return tree[x].sum;
	}
	int ans = 0;
	if(mid>=from){
		ans = (ans + query1(lc,l,mid,from,to));
	}
	if(mid<to){
		ans = (ans + query1(rc,mid+1,r,from,to));
	}	
	return ans%MOD;
}
int query2(int x,int l,int r,int from,int to){
	if(l>=from&&r<=to){
		return tree[x].sum1;
	}
	int ans = 0; 
	if(mid>=from){
		ans = (ans + query2(lc,l,mid,from,to));
	}
	if(mid<to){
		ans = (ans + query2(rc,mid+1,r,from,to));
	}
	return ans%MOD;
}
inline void init(){
	inv[0] = inv[1] = 1;
	for(int i = 2;i<=n;++i){
		inv[i] = (MOD-MOD/i)*inv[MOD%i]%MOD;
	}
}
int ksm(int x,int y){
	int ans = 1;
	while(y){
		if(y&1){
			ans = ans*x%MOD;
		}
		x = x*x%MOD;
		y>>=1;
	}
	return ans;
}
signed main(){
	read(n);read(m);
	init();
	for(int i =1;i<=n;++i){
		read(a[i]);
	}
	
	build(1,1,n);
	int opt = 0,l = 0,r = 0;
	while(m--){
		read(opt);read(l);read(r);
		if(opt == 1){
			update(1,1,n,l,l,r);
		}else{
			int len = (r-l)+1;
			int sum1 = query1(1,1,n,l,r) *inv[len]%MOD;
			cout <<debug<<sum1<<endl;
			int sum2 = query2(1,1,n,l,r) *inv[len]%MOD;
			write((ll)(sum2 - sum1*sum1%MOD + MOD)%MOD);
			putchar('\n');
		}
	}
	return 0;
}

感谢

2024/12/3 17:10
加载中...