社区讨论
样例过,全WA
P2357守墓人参与者 2已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @lsybcf5l
- 此快照首次捕获于
- 2024/02/23 15:10 2 年前
- 此快照最后确认于
- 2024/02/23 15:42 2 年前
CPP
#include <bits/stdc++.h>
using namespace std;
// define
#define re register
#define fi first
#define se second
#define pb push_back
#define il inline
#define co const
#define ls (rt << 1)
#define rs (rt << 1 | 1)
#define lowbit(x) x & -x
#define all(x) x.begin(), x.end()
#define fst ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define fup(x, l, r) for (re int x = (l), eNd = (r); x <= eNd; ++ x )
#define fdw(x, r, l) for (re int x = (r), eNd = (l); x >= eNd; -- x )
#define int long long
// typedef
typedef pair<int, int> PII;
typedef long long ll;
typedef long double ld;
typedef list <int >::iterator iter;
// const
const int N = 1e6 + 10, M = 2e6 + 10;
const int INF = 2e9, P = 998244353;
const double eps = 1e-6;
// common functions
il int Max(co auto a, co auto b) { return a > b ? a : b; }
il int Min(co auto a, co auto b) { return a < b ? a : b; }
il ll read() { re ll x = 0; re bool f = true; re char c = getchar(); while (c < 48 || c > 57) { (c == '-') ? f = false : 0; c = getchar(); } while (c > 47 && c < 58) x = (x << 3) + (x << 1) + c - 48, c = getchar(); return f ? x : -x; }
il void write(re auto x) { (x < 0) ? putchar('-'), x = -x : 0; (x > 9) ? write(x / 10) : void(); putchar(x % 10 + 48); return; }
il void wel(co auto x) { write(x), putchar('\n'); return; }
il void wel(co auto x, co auto y) { write(x), putchar(' '), write(y), putchar('\n'); return; }
il void wel(co auto x, co auto y, co auto z) { write(x), putchar(' '), write(y), putchar(' '), write(z), putchar('\n'); return; }
il void wsp(co auto x) { write(x), putchar(' '); return; }
int n,f;
int a[N];
struct node
{
int l,r;
int sum;
int lz;
}tr[N<<2];
void pushup(int rt)
{
tr[rt].sum=tr[ls].sum+tr[rs].sum;
}
void pushdown(int rt)
{
if(tr[rt].lz)
{
int mid=(tr[rt].l+tr[rt].r)>>1;
tr[ls].sum+=(mid-tr[rt].l+1)*tr[rt].lz;
tr[rs].sum+=(tr[rt].r-mid)*tr[rt].lz;
tr[ls].lz+=tr[rt].lz;
tr[rs].lz+=tr[rt].lz;
tr[rt].lz=0;
}
}
void build(int rt,int l,int r)
{
tr[rt].l=l,tr[rt].r=r;
if(l==r)
{
tr[rt].sum=a[l];
return ;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(rt);
}
void update(int rt,int l,int r,int v)
{
if(tr[rt].l>=l&&tr[rt].r<=r)
{
tr[rt].sum+=(r-l+1)*v;
tr[rt].lz+=v;
return ;
}
pushdown(rt);
int mid=(tr[rt].l+tr[rt].r)>>1;
if(l<=mid) update(ls,l,r,v);
if(r>mid) update(rs,l,r,v);
pushup(rt);
}
int query(int rt,int l,int r)
{
if(tr[rt].l>=l&&tr[rt].r<=r) return tr[rt].sum;
pushdown(rt);
int mid=(tr[rt].l+tr[rt].r)>>1;
int ans=0;
if(l<=mid) ans=query(ls,l,r);
if(r>mid) ans+=query(rs,l,r);
return ans;
}
int p;
signed main()
{ fst;
cin>>n>>f;
fup(i,1,n) cin>>a[i];
build(1,1,n);
fup(i,1,f)
{
int op;
cin>>op;
if(op==1)
{
int l,r,k;
cin>>l>>r>>k;
update(1,l,r,k);
}
else if(op==2)
{
int k;
cin>>k;
p+=k;
}
else if(op==3)
{
int k;
cin>>k;
p-=k;
}
else if(op==4)
{
int l,r;
cin>>l>>r;
cout<<query(1,l,r)+(l==1)*p<<endl;
}
else
{
cout<<p+query(1,1,1)<<endl;
}
}
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...