社区讨论
Hack全过,SubTask0全错,求调(码风良好)
P5278算术天才⑨与等差数列参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @md9y2eqm
- 此快照首次捕获于
- 2025/07/19 15:46 8 个月前
- 此快照最后确认于
- 2025/07/19 16:16 8 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=3e5+5;
const int inf=1e18+7;
#define lson (u<<1)
#define rson (u<<1|1)
#define mid ((l+r)>>1)
int a[maxn],d[maxn];
int n,m,cnt;
map<int,set<int>> mp;
int anc[maxn],suc[maxn];
void remove(int x){
auto &s=mp[a[x]];
auto it=s.find(x);
if(it==s.end())return;
if(it!=s.begin()){
auto pre=prev(it);
suc[*pre]=suc[x];
}
if(next(it)!=s.end()){
auto nex=next(it);
anc[*nex]=anc[x];
}
s.erase(it);
if(s.empty())mp.erase(a[x]);
}
void insert(int x,int y){
a[x]=y;
auto &s=mp[y];
auto it=s.lower_bound(x);
if(it!=s.end()){
suc[x]=*it;
anc[*it]=x;
}else{
suc[x]=n+1;
}
if(it!=s.begin()){
auto pre=prev(it);
anc[x]=*pre;
suc[*pre]=x;
}else{
anc[x]=0;
}
s.insert(x);
}
void change(int x,int y){
if(a[x]==y)return;
remove(x);
insert(x,y);
}
struct seg_tree{
struct treenode{
int l,r,mx,mn,mxanc;
}tree[maxn<<2];
void pushup(int u){
tree[u].mx=max(tree[lson].mx,tree[rson].mx);
tree[u].mn=min(tree[lson].mn,tree[rson].mn);
tree[u].mxanc=max(tree[lson].mxanc,tree[rson].mxanc);
}
void build(int u,int l,int r){
tree[u].l=l,tree[u].r=r;
if(l==r){
tree[u].mx=tree[u].mn=a[l];
tree[u].mxanc=anc[l];
return;
}
build(lson,l,mid);
build(rson,mid+1,r);
pushup(u);
}
void update(int u,int p,int x){
int l=tree[u].l,r=tree[u].r;
if(l>p||r<p)return;
if(l==r){
change(p,x);
tree[u].mxanc=anc[p];
// cout<<"mxanc:"<<tree[u].mxanc<<endl;
tree[u].mx=tree[u].mn=x;
// cout<<l<<' '<<r<<endl;
return;
}
if(p<=mid)update(lson,p,x);
else update(rson,p,x);
pushup(u);
}
int querymn(int u,int L,int R){
int l=tree[u].l,r=tree[u].r;
if(l>R||r<L)return inf;
if(L<=l&&r<=R)return tree[u].mn;
return min(querymn(lson,L,R),querymn(rson,L,R));
}
int querymx(int u,int L,int R){
int l=tree[u].l,r=tree[u].r;
if(l>R||r<L)return -inf;
if(L<=l&&r<=R)return tree[u].mx;
return max(querymx(lson,L,R),querymx(rson,L,R));
}
int queryanc(int u,int L,int R){
int l=tree[u].l,r=tree[u].r;
if(l>R||r<L)return -1;
if(L<=l&&r<=R)return tree[u].mxanc;
return max(queryanc(lson,L,R),queryanc(rson,L,R));
}
}tree_a;
struct segtree{
struct treenode{
int l,r;
int gcd;
}tree[maxn<<2];
void pushup(int u){
tree[u].gcd=__gcd(tree[lson].gcd,tree[rson].gcd);
}
void build(int u,int l,int r){
tree[u].l=l,tree[u].r=r;
if(l==r){
tree[u].gcd=d[l];
return;
}
build(lson,l,mid);
build(rson,mid+1,r);
pushup(u);
}
void update(int u,int p,int x){
int l=tree[u].l,r=tree[u].r;
if(l>p||r<p)return;
if(l==r){
tree[u].gcd+=x;
tree[u].gcd=abs(tree[u].gcd);
return;
}
update(lson,p,x);
update(rson,p,x);
pushup(u);
}
int querygcd(int u,int L,int R){
int l=tree[u].l,r=tree[u].r;
if(l>R||r<L)return 0;
if(L<=l&&r<=R)return tree[u].gcd;
return __gcd(querygcd(lson,L,R),querygcd(rson,L,R));
}
}tree_d;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
d[i]=abs(a[i]-a[i-1]);
insert(i,a[i]);
}
tree_a.build(1,1,n);
tree_d.build(1,1,n);
while(m--){
int op;
cin>>op;
if(op==1){
int x,y;
cin>>x>>y;
x^=cnt,y^=cnt;
int val=a[x],oldsuc=suc[x];
tree_a.update(1,x,y);
int newsuc=suc[x];
tree_a.update(1,oldsuc,a[oldsuc]);
tree_a.update(1,newsuc,a[newsuc]);
tree_d.update(1,x,y-val);
if(x!=n)tree_d.update(1,x+1,val-y);
}else{
int l,r,k;
l^=cnt,r^=cnt,k^=cnt;
cin>>l>>r>>k;
if(l==r){
cout<<"Yes"<<endl;
cnt++;
continue;
}
int mn=tree_a.querymn(1,l,r);
int mx=tree_a.querymx(1,l,r);
int mxanc=tree_a.queryanc(1,l,r);
int gcd=tree_d.querygcd(1,l+1,r);
// cout<<mx<<' '<<mn<<' '<<mxanc<<' '<<gcd<<endl;
if(k==0){
if(mx==mn&&mxanc<l){
cout<<"Yes"<<endl;
cnt++;
}
else cout<<"No"<<endl;
continue;
}
if((mx-mn==(r-l)*k)&&mxanc<l&&gcd==k){
cout<<"Yes"<<endl;
cnt++;
}else{
cout<<"No"<<endl;
}
}
// for(int i=1;i<=n;i++)cout<<anc[i]<<' ';puts("");
// cout<<tree_a.tree[1].mxanc<<endl;
// for(int u=1;u<=13;u++){
// cout<<tree_a.tree[u].l<<' '<<tree_a.tree[u].r<<' '<<tree_a.tree[u].mxanc<<endl;
// }
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...