社区讨论

60pts线段树求助,#13-20 MLE

P4939Agent2参与者 5已保存回复 10

讨论操作

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

当前回复
10 条
当前快照
1 份
快照标识符
@lo9d7liv
此快照首次捕获于
2023/10/28 09:30
2 年前
此快照最后确认于
2023/10/28 09:30
2 年前
查看原帖
这是评测记录
惨案源代码:
CPP
#include<bits/stdc++.h>
using namespace std;
long long arr[10000005],n,m,a,c,b;
struct node{
	long long l,r,sum,len,tag;
	node operator+(const node &x){
		return {l,x.r,sum+x.sum,len+x.len,0};
	}
}stree[40000020];
#define pushup(now) stree[now]=stree[now<<1]+stree[now<<1|1]
inline void givetag(int tag,int now){
	if(stree[now].l==stree[now].r){
		stree[now].sum+=tag;
		return;
	}
	stree[now].tag+=tag;
	stree[now].sum+=stree[now].len*tag;
}
inline void pushtag(int now){
	givetag(stree[now].tag,now<<1);
	givetag(stree[now].tag,now<<1|1);
	stree[now].tag=0;
}
void build(int l,int r,int now){
	if(l==r){
		stree[now]={l,l,arr[l],0,1};
		return;
    }
	int mid=l+r>>1;
	build(l,mid,now<<1);
	build(mid+1,r,now<<1|1);
	pushup(now);
}
void change(int l,int r,int v,int now){
	if(stree[now].tag)pushtag(now);
	if(stree[now].l>=l&&stree[now].r<=r){
		givetag(v,now);
		return;
	}if(stree[now].r<l||stree[now].l>r){
		return;
	}else{
		change(l,r,v,now<<1);
		change(l,r,v,now<<1|1);
	}
	pushup(now);
}
long long query(int l,int r,int now){
	if(stree[now].tag)pushtag(now);
	if(l<=stree[now].l&&r>=stree[now].r)return stree[now].sum;
	else if(stree[now].r<l||stree[now].l>r)return 0;
	return query(l,r,now<<1)+query(l,r,now<<1|1);
}
inline long long read(){
	long long x=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*w;
}
int main(){
	n=read(),m=read();
	build(1,n,1);
	while(m--){
		c=read();
		if(c==0)a=read(),b=read(),change(a,b,1,1);
		else a=read(),printf("%lld\n",query(a,a,1));
	}
} 
求大佬调教qwq

回复

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

正在加载回复...