很水的线段树
2024-12-31 18:33:15
发布于:广东
17阅读
0回复
0点赞
一场比赛出两道维护题,希望可以有更好的练手或者思路题。
那由于题目太水,直接上代码吧。
维护单点值和用一个区间懒标记,简单解决。
#include<iostream>
using namespace std;
const int N=200005,maxn=1000000000000;
struct tree{
long long val;
long long tag;
int l,r;
}t[N<<2];
int a[N];
int n,q;
inline void build(int p,int l,int r){
t[p].l=l,t[p].r=r;
t[p].tag=maxn;
if(l==r){
t[p].val=a[l];
return;
}
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
t[p].val=t[p<<1].val+t[p<<1|1].val;
}
inline void pushdown(int p){
if(t[p].tag!=maxn){
t[p<<1].tag=t[p].tag;
t[p<<1|1].tag=t[p].tag;
t[p<<1].val=t[p].tag*(t[p<<1].r-t[p<<1].l+1);
t[p<<1|1].val=t[p].tag*(t[p<<1|1].r-t[p<<1|1].l+1);
t[p].tag=maxn;
}
}
inline void add(int p,int id,long long c){
if(t[p].l==t[p].r && t[p].l==id){
t[p].val+=c;
return;
}
pushdown(p);
int mid=t[p].l+t[p].r>>1;
if(id<=mid) add(p<<1,id,c);
if(id>mid) add(p<<1|1,id,c);
t[p].val=t[p<<1].val+t[p<<1|1].val;
}
inline long long query(int p,int id){
if(t[p].l==t[p].r && t[p].l==id){
return t[p].val;
}
pushdown(p);
int mid=t[p].l+t[p].r>>1;
if(id<=mid) return query(p<<1,id);
if(id>mid) return query(p<<1|1,id);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
cin>>q;
long long op,x,y;
for(int i=1;i<=q;i++){
cin>>op;
if(op==1){
cin>>x;
t[1].tag=x;
}
else if(op==2){
cin>>x>>y;
add(1,x,y);
}
else{
cin>>y;
cout<<query(1,y)<<'\n';
}
}
}
全部评论 1
事实上这就是思维题
2024-12-31 来自 广东
0考你STL数据结构掌握程度的
2024-12-31 来自 广东
0不瞒说,T2用Treap写的
2025-01-01 来自 广东
0佬的思维就是不一样
2025-01-01 来自 广东
0
有帮助,赞一个