树状数组维护区间修改,区间查询,求调
  • 板块灌水区
  • 楼主Surge_of_Force
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/10/7 16:15
  • 上次更新2023/11/4 04:25:45
查看原帖
树状数组维护区间修改,区间查询,求调
230875
Surge_of_Force楼主2021/10/7 16:15

RT,题目是P2357

#include<bits/stdc++.h>
#include<math.h>
//#include<cstring>
#define ll long long
#define int long long
const int MAX=2e5+10;
using namespace std;
inline ll read()
{
	char qwqc=getchar();ll qwqf=1,qwqx=0;
	while(qwqc<'0'||qwqc>'9'){if(qwqc=='-') qwqf=-1;qwqc=getchar();}
	while(qwqc>='0'&&qwqc<='9'){qwqx=(qwqx<<3)+(qwqx<<1)+(qwqc^48);qwqc=getchar();}
	return qwqf*qwqx;
}
inline void write(ll x)
{
	if(x<0){putchar('-');x=-x;}
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
ll c1[MAX],c2[MAX],lat,n,m;
inline int lowbit(int x){return x&-x;}
inline int ask(int x,ll t[])
{
	ll ans=0;
	while(x)
	{
		ans+=t[x];
		x-=lowbit(x);
	}
	return ans;
}
inline void add(int x,ll k,ll t[])
{
	while(x<=n)
	{
		t[x]+=k;
		x+=lowbit(x);
	}
}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		ll x=read();
		add(i,x-lat,c1);
		add(i,i*(x-lat),c2);
		lat=x;
	}
//	for(int i=1;i<=n;i++) cout<<c1[i]<<" ";
//	cout<<endl;
	while(m--)
	{
		int op=read(),l,r,k;
		if(op==1||op==2||op==3)
		{
			if(op==1) {l=read(),r=read();ll k=read();}
		 	if(op==2) {l=1,r=1,k=read();}
		 	if(op==3) {l=1,r=1,k=read();k*=-1;}
			add(l,k,c1);add(r+1,-k,c1);
			add(l,l*k,c2);add(r+1,(-r-1)*k,c2);
		}
		else
		{
			if(op==4) {l=read(),r=read();}
			if(op==5) {l=1,r=1;}
			write(((r+1)*ask(r,c1)-ask(r,c2))-(l*ask(l-1,c1)-ask(l-1,c2)));
			putchar('\n');
		}
		for(int i=1;i<=n;i++) cout<<c1[i]<<" ";
			cout<<endl;
	}
	return 0;
}

2021/10/7 16:15
加载中...