社区讨论
线段树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 条回复,欢迎继续交流。
正在加载回复...