社区讨论
int 转ll 会错?
P3372【模板】线段树 1参与者 4已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mihltsfe
- 此快照首次捕获于
- 2025/11/27 23:44 3 个月前
- 此快照最后确认于
- 2025/11/29 13:15 3 个月前
RT
CPP#include<bits/stdc++.h>
#define pn putchar('\n')
#define ps putchar(' ')
#define rec(x) scanf(" %c",&(x))
#define ls(i) (i<<1)
#define rs(i) (i<<1|1)
#define In(x) freopen(x".in","r",stdin)
#define Out(x) freopen(x".out","w",stdout)//out!!!!
#define File(x) (In(x),Out(x))
#define fi first
#define se second
#define endl '\n'
#define de(x) cout << #x << ": " << x << endl
#define pub push_back
#define pob pop_back
#define rep(x,start,end) for(auto x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?++x:--x))
using namespace std;
typedef long long ll;
template <typename T> void re(T &t) {
t=0; char ch=getchar(); int f=1;
while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }
do { (t=((t<<3)+(t<<1)))+=(ch^48); ch=getchar(); } while ('0'<=ch&&ch<='9'); t*=f;
}
inline void wr(ll x){
if(x<0) putchar('-'),x=-x;
if(x>9) wr(x/10);
putchar(x%10+'0');
}
int a[200005];
int n,m;
struct seg{
ll v,tg;
}t[800005];
void psu(int x){
t[x].v=t[ls(x)].v+t[rs(x)].v;
}
void f(int x,int l,int r,ll k){
t[x].tg+=k;
t[x].v+=1ll*(r-l+1)*k;
}
void psd(int x,int l,int r){
if(t[x].tg==0) return;
int mid=l+r>>1;
f(ls(x),l,mid,t[x].tg);
f(rs(x),mid+1,r,t[x].tg);
t[x].tg=0;
}
void build(int u,int l,int r){
if(l==r){
t[u].v=(ll)a[l];
return ;
}
int mid=l+r>>1;
build(ls(u),l,mid);
build(rs(u),mid+1,r);
psu(u);
}
ll ask(int u,int l,int r,int ml,int mr){
if(l>=ml && r<=mr) return t[u].v;
int mid=l+r>>1;
psd(u,l,r);
ll res=0;
if(ml<=mid) res+=ask(ls(u),l,mid,ml,mr);
if(mr>mid) res+=ask(rs(u),mid+1,r,ml,mr);
return res;
}
void upd(int u,int l,int r,int ml,int mr,ll x){
if(l>=ml && r<=mr){
f(u,l,r,x);
return ;
}
int mid=l+r>>1;
psd(u,l,r);
if(ml<=mid) upd(ls(u),l,mid,ml,mr,x);
if(mr>mid) upd(rs(u),mid+1,r,ml,mr,x);
psu(u);
}
signed main(){
//File("");
re(n),re(m);
rep(i,1,n+1) re(a[i]);
build(1,1,n);
rep(i,1,m+1){
int o,x,y;
ll k;
re(o),re(x),re(y);
if(o==1){
re(k);
upd(1,1,n,x,y,k);
}
else{
wr(ask(1,1,n,x,y)),pn;
}
}
//return 0;
}
这个a是int 在建树的时候转ll就只有95pts
回复
共 9 条回复,欢迎继续交流。
正在加载回复...