一个奇怪我的问题
查看原帖
一个奇怪我的问题
984679
illidan_楼主2024/5/18 20:19

一个正常的线段树,队友看了也没什么问题,但是在洛谷上提交开了o2就会T,不开o2就rte了,c++的编译器试了很多都是这个问题,但是测试点一在我自己的编译器上是正确的,今天换了自动识别语言的编译器关掉o2就过了,大佬们能帮忙看一下吗,我做了一道其他的线段树也是这个问题```cpp #include <bits/stdc++.h> #define int long long #define ull unsigned long long #define id(i,j) (i-1)*m+j #define endl '\n'

using namespace std;

const int N = 2e5+10; typedef pair<int,int> PII;

int n,m,ans,T; int a[N], tree[N<<2], tag[N<<2];

int push_up(int p) { tree[p] = tree[p * 2] + tree[p * 2 + 1]; }

int add_tag(int id, int l, int r, int num) { tag[id] += num; tree[id] += (r - l + 1) * num; }

int push_down(int id, int l, int r) { if(tag[id] != 0) { int mid = (l + r) >> 1; add_tag(id * 2, l, mid, tag[id]); add_tag(id * 2 + 1, mid + 1, r, tag[id]); tag[id] = 0; } }

void update(int L, int R, int l, int r, int id, int num) { if(l >= L && r <= R) { add_tag(id,l,r,num); return ; } push_down(id, l, r); int mid = (l + r) >> 1; if(mid >= L) update(L,R,l,mid,id*2,num); if(mid < R) update(L,R,mid + 1,r,id * 2 + 1,num); // 等于号 push_up(id); }

int query(int L, int R, int l, int r, int id) { if(l >= L && r <= R) { return tree[id]; } push_down(id,l,r); int res = 0, mid = (l + r) / 2; if(mid >= L) res += query(L,R,l,mid,id*2); if(mid < R) res += query(L,R,mid + 1,r,id * 2 + 1); return res; }

void build(int l, int r, int id) { if(l == r) { tree[id] = a[l]; return; } int mid = (l + r) / 2; build(l, mid, id * 2); build(mid + 1, r, id * 2 + 1); push_up(id); }

signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin>>n>>T; for(int i = 1 ;i <= n; i ++) cin>>a[i];
build(1,n,1);
while(T --) { int op,L,R,num; cin>>op; if(op == 1) { cin>>L>>R>>num; update(L,R,1,n,1,num); } else { cin>>L>>R; cout<<query(L,R,1,n,1)<<endl; } } return 0; }

2024/5/18 20:19
加载中...