社区讨论

线段树10pts 求条

P5278算术天才⑨与等差数列参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhjl8cwb
此快照首次捕获于
2025/11/04 04:23
4 个月前
此快照最后确认于
2025/11/04 04:23
4 个月前
查看原帖
CPP
#include <iostream>
#define maxn 300005
#define lm mid
#define rm mid+1
#define lp p<<1
#define rp p<<1|1
#define uu unsigned long long
using namespace std;
struct node{
	int l,r;uu val1,val2;
	node friend operator +(node a,node b){
		return {min(a.l,b.l),max(a.r,b.r),a.val1+b.val1,a.val2+b.val2};
	}
}tri[maxn<<2];
int n,m,lst,a[maxn];
uu k;
void push(int p){
	tri[p]=tri[lp]+tri[rp];
}
void build(int l,int r,int p){
	if(l==r) return tri[p]={a[l],a[l],1ull*a[l]*a[l]*a[l],1ull*a[l]*a[l]},void();
	int mid=l+r>>1;
	build(l,lm,lp);
	build(rm,r,rp);
	push(p);
}
void chg(int l,int r,int p,int k,int d){
	if(l==r) return tri[p]={d,d,1ull*d*d*d,1ull*d*d},void();
	int mid=l+r>>1;
	if(k<=lm) chg(l,lm,lp,k,d);
	else      chg(rm,r,rp,k,d);
	push(p);
}
node ask(int l,int r,int p,int s,int t){
	if(s<=l&&r<=t) return tri[p];
	int mid=l+r>>1;
	if(s<=lm&&rm<=t) return ask(l,lm,lp,s,t)+ask(rm,r,rp,s,t);
	if(s<=lm) return ask(l,lm,lp,s,t);
	else      return ask(rm,r,rp,s,t);
}
uu calc1(uu x){
	uu n=x/k+1,t=x%k-k;
	return n*n*(n+1)*(n+1)*k*k*k+n*(n+1)*(2*n+1)*k*k*t*2+n*(n+1)*k*t*t*6+n*t*t*t*4;
}
uu calc2(uu x){
	uu n=x/k+1,t=x%k-k;
	return n*(n+1)*(2*n+1)*k*k+n*(n+1)*k*t*6+n*t*t*6;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int op,x,y;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,n,1);
	for(int i=1;i<=m;i++){
    	cin>>op>>x>>y;x^=lst,y^=lst;
    	if(op==1) chg(1,n,1,x,y);
    	else{
    		cin>>k;k^=lst;
    		if(x==y){
    			cout<<"Yes\n",lst++;
    			continue;
			}
			if(k==0){
                cout<<"No\n";
                continue;
            }
    		node p=ask(1,n,1,x,y);
    		if(p.r-p.l!=(y-x)*k){
				cout<<"No\n";
				continue;
			}
    		uu val1=calc1(p.r)-calc1(p.l-1),val2=calc2(p.r)-calc2(p.l-1);
    		if(val1==p.val1*4&&val2==p.val2*6) cout<<"Yes\n",lst++;
    		else cout<<"No\n";
		}
	}
}
代码维护了区间平方和(val2)和区间立方和(val1),用ull的自然溢出。
除#2和hack数据全爆tle,提交记录

回复

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

正在加载回复...