社区讨论
线段树10分求调
P3368【模板】树状数组 2参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @m2fkbzpd
- 此快照首次捕获于
- 2024/10/19 10:51 去年
- 此快照最后确认于
- 2025/11/04 16:52 4 个月前
10分代码:(样例是对的)
CPP#include<bits/stdc++.h>
using namespace std;
struct node{
long long l;
long long r;
long long f;
long long w;
}tree[5000005];
inline void build(long long k,long long ll,long long rr){
tree[k].l=ll;
tree[k].r=rr;
if(tree[k].l==tree[k].r){
cin>>tree[k].w;
return ;
}
long long mid=(tree[k].l+tree[k].r)/2;
build(2*k,ll,mid);
build(2*k+1,mid+1,rr);
tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
inline void down(long long k) {
tree[2*k].f+=tree[k].f;
tree[2*k+1].f+=tree[k].f;
tree[2*k].w+=tree[k].f*(tree[2*k].r-tree[2*k].l+1);
tree[2*k+1].w=tree[k].f*(tree[2*k+1].r-tree[2*k+1].l+1);
tree[k].f=0;
}
inline void change_interval(long long k,long long x,long long y,long long add){
if(x<=tree[k].l && y>=tree[k].r) {
tree[k].w+=add*(tree[k].r-tree[k].l+1);
tree[k].f+=add;
return ;
}
if(tree[k].f) {
down(k);
}
long long mid=(tree[k].l+tree[k].r)/2;
if(x<=mid) {
change_interval(2*k,x,y,add);
}
if(y>mid) {
change_interval(2*k+1,x,y,add);
}
tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
inline long long ask_point(long long k,long long x){
if(tree[k].l==tree[k].r){
return tree[k].w;
}
if(tree[k].f) {
down(k);
}
long long mid=(tree[k].l+tree[k].r)/2;
if(x<=mid){
return ask_point(2*k,x);
}
else{
return ask_point(2*k+1,x);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
long long n,m;
cin>>n>>m;
build(1,1,n);
for(int i=1;i<=m;i++){
long long op;
cin>>op;
if(op==1){
long long x,y,k;
cin>>x>>y>>k;
change_interval(1,x,y,k);
}
else{
long long x;
cin>>x;
cout<<ask_point(1,x)<<"\n";
}
}
return 0;
}
求调
回复
共 3 条回复,欢迎继续交流。
正在加载回复...