求助!样例都能过,交上去是WA的,怎么回事?
查看原帖
求助!样例都能过,交上去是WA的,怎么回事?
261262
WaltVBAlston楼主2021/9/19 17:25

RT,我的代码:

#include<iostream>
#include<cstdio>
using namespace std;
#define MAXN 100005
struct node{
	int maxn,val,l,r;
}tree[4*MAXN];
int n,m,a[MAXN];
inline void build(int i,int l,int r){
	tree[i].l=l,tree[i].r=r,tree[i].maxn=-2147483647;
	if(l==r){
		tree[i].maxn=tree[i].val=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(i*2,l,mid),build(i*2+1,mid+1,r);
	tree[i].val=tree[i*2].val+tree[i*2+1].val;
	tree[i].maxn=max(tree[i*2].maxn,tree[i*2+1].maxn);
	return;
}
inline int sum(int i,int l,int r){
	if(tree[i].l>=l&&tree[i].r<=r)
		return tree[i].val;
	int mid=(tree[i].l+tree[i].r)>>1,res=0;
	if(mid>=l)
		res+=sum(i*2,l,r);
	if(mid+1<=r)
		res+=sum(i*2+1,l,r);
	return res;
}
inline void update_mod(int i,int l,int r,int x){
	if(tree[i].maxn<x)
		return;
	if(tree[i].l==tree[i].r){
		tree[i].maxn%=x;
		tree[i].val%=x;
		return;
	}
	int mid=(tree[i].l+tree[i].r)>>1;
	if(mid>=l)
		update_mod(i*2,l,r,x);
	if(mid+1<=r)
		update_mod(i*2+1,l,r,x);
	tree[i].maxn=max(tree[i*2].maxn,tree[i*2+1].maxn);
	tree[i].val=tree[i*2].val+tree[i*2+1].val;
	return;
}
inline void update_point(int i,int k,int x){
	if(tree[i].l==tree[i].r){
		tree[i].maxn=x;
		tree[i].val=x;
		return;
	}
	int mid=(tree[i].l+tree[i].r)>>1;
	if(k<=mid)
		update_point(i*2,k,x);
	if(k>=mid+1)
		update_point(i*2+1,k,x);
	tree[i].maxn=max(tree[i*2].maxn,tree[i*2+1].maxn);
	tree[i].val=tree[i*2].val+tree[i*2+1].val;
	return;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	build(1,1,n);
	while(m--){
		int op;
		scanf("%d",&op);
		if(op==1){
			int l,r;
			scanf("%d%d",&l,&r);
			printf("%d\n",sum(1,l,r));
		}
		else if(op==2){
			int l,r,x;
			scanf("%d%d%d",&l,&r,&x);
			update_mod(1,l,r,x);
		}
		else{
			int k,x;
			scanf("%d%d",&k,&x);
			update_point(1,k,x);
		}
	}
	return 0;
}
2021/9/19 17:25
加载中...