为什么一样的代码一遍AC,一遍CE
查看原帖
为什么一样的代码一遍AC,一遍CE
562686
yeshubo_qwq楼主2022/7/18 16:04

RT,代码:

#include <bits/stdc++.h>
#define N 1ll00005
#define int long long
using namespace std;
int n,m,i,a[N],op,x,y,z;
struct SegmentTree{
	int l,r,x,mx;
}tr[N<<2ll];
void push_up(int pos){
	tr[pos].x=tr[pos<<1ll].x+tr[pos<<1ll|1ll].x;
	tr[pos].mx=max(tr[pos<<1ll].mx,tr[pos<<1ll|1ll].mx);
}
void build(int pos,int l,int r){
	tr[pos].l=l,tr[pos].r=r;
	if (l==r){
		tr[pos].x=a[l],tr[pos].mx=a[l];
		return ;
	}
	int mid=(l+r)>>1ll;
	build(pos<<1ll,l,mid);
	build(pos<<1ll|1ll,mid+1ll,r);
	push_up(pos);
}
void gmod(int pos,int l,int r,int p){
 	if (tr[pos].mx<p) return ;
	if (tr[pos].l==tr[pos].r){
		tr[pos].x%=p,tr[pos].mx%=p;
		return ;
	}
	int mid=(tr[pos].l+tr[pos].r)>>1ll;
	if (l<=mid) gmod(pos<<1ll,l,mid,p);
	if (r>mid) gmod(pos<<1ll|1ll,mid+1ll,r,p);
	push_up(pos);
}
void gpot(int pos,int x,int v){
	if (tr[pos].l==tr[pos].r && tr[pos].l==x){
		tr[pos].x=v,tr[pos].mx=v;
		return ;
	}
	int mid=(tr[pos].l+tr[pos].r)>>1ll;
	if (x<=mid) gpot(pos<<1ll,x,v);
	if (x>mid) gpot(pos<<1ll|1ll,x,v);
	push_up(pos);
}
int query(int pos,int l,int r){
    if (l<=tr[pos].l && tr[pos].r<=r) return tr[pos].x;
    int mid=(tr[pos].l+tr[pos].r)>>1ll;
    int ans=0;
    if (l<=mid) ans+=query(pos<<1ll,l,r);
    if (r>mid)  ans+=query(pos<<1ll|1ll,l,r);
    return ans;
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for (i=1ll;i<=n;i++) cin>>a[i];
	build(1ll,1ll,n);	
	for (i=1ll;i<=m;i++){
		cin>>op;
		if (op==1ll) cin>>x>>y,cout<<query(1ll,x,y)<<'\n';
		else if (op==2ll) cin>>x>>y>>z,gmod(1ll,x,y,z);
		else cin>>x>>z,gpot(1ll,x,z);
	}
	return 0;
}

第二次提交在最后加了 //,评测结果:

第一次第二次

2022/7/18 16:04
加载中...