社区讨论

样例过,全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 条回复,欢迎继续交流。

正在加载回复...