社区讨论
线段树 WA 0pt 求调
P3372【模板】线段树 1参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhju7k6i
- 此快照首次捕获于
- 2025/11/04 08:35 4 个月前
- 此快照最后确认于
- 2025/11/04 08:35 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N 1000005
#define oor(x,y,X,Y) ((x) > (Y) || (X) > (y))
#define ir(x,y,X,Y) ((y) <= (Y) && (X) <= (x))
int tree[N],tag[N],r[N],g[N];
void init(int l,int r,int val)
{
tree[val] = g[r] - g[l - 1];
if(l < r)
{
init(l,(l + r) >> 1,(val << 1));
init(((l + r) >> 1) + 1,r,(val << 1) + 1);
}
}
void push(int l,int r,int _l,int _r,int val,int now)
{
//cout << l << " " << r << " " << _l << " " << _r << endl;
if(oor(l,r,_l,_r)) return;
if(ir(l,r,_l,_r))
{
tag[now] += val;
return;
}
if(l < r)
{
push(l,(l + r) >> 1,_l,_r,val,(now << 1));
push(((l + r) >> 1) + 1,r,_l,_r,val,(now << 1) + 1);
}
}
void pushdown(int now,int l,int r)
{
tag[(now << 1)] += tag[now];
tag[(now << 1) + 1] += tag[now];
tree[now] += tag[now] * (r - l + 1);
tag[now] = 0;
}
int query(int l,int r,int _l,int _r,int now)
{
//cout << l << " " << r << endl;
int ans = 0;
if(tag[now] > 0) pushdown(now,l,r);
if(oor(l,r,_l,_r)) return 0;
if(ir(l,r,_l,_r))
{
//cout << tree[now] << "$" << endl;
return tree[now];
}
ans += query(l,(l + r) >> 1,_l,_r,(now << 1));
ans += query(((l + r) >> 1) + 1,r,_l,_r,(now << 1) + 1);
//cout << ans << "$" << endl;
return ans;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
cin >> r[i];
g[i] = g[i - 1] + r[i];
}
init(1,n,1);
//cout << "!!!\n";
for(int i = 1; i <= m; i++)
{
int op,x,y,k;
cin >> op >> x >> y;
if(op == 1)
{
cin >> k;
push(1,n,x,y,k,1);
}
else cout << query(1,n,x,y,1) << '\n';
//cout << "坠!机!!!\n";
}
return 0;
}
代码0分,求调
回复
共 3 条回复,欢迎继续交流。
正在加载回复...