线段树求助!样例输出了12!
  • 板块P1438 无聊的数列
  • 楼主卷王慢即快
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/8/11 12:58
  • 上次更新2023/10/27 15:58:21
查看原帖
线段树求助!样例输出了12!
494699
卷王慢即快楼主2022/8/11 12:58

先端数求祝!阳历书橱乐市二!

#include<bits/stdc++.h>
using namespace std;
#define maxn 100001
typedef long long ll;
ll x[maxn*4],y[maxn*4],w[maxn*4];
int n,m,opt,a[10682];
inline void push_up(int u){w[u]=w[u<<1]+w[u<<1|1];}
inline bool in_range(int L,int R,int l,int r){return (R<=r)&&(L>=l);}
inline bool outof_range(int L,int R,int l,int r){return (L>r)||(R<l);}
inline void build(int u,int L,int R)
{
	int mid=(L+R)>>1;
	if(L==R)
	{
		w[u]=a[L];
		return;
	}
	build(u<<1,L,mid);
	build(u<<1|1,mid+1,R);
	push_up(u);
}
inline ll Sum(int ax,int ay,int len)
{
	int an=ax+ay*(len-1ll);
	return 1ll*(ax+an)*len/2;
}
inline void maketag(int u,int l,int r,int ax,int ay)
{
	x[u]+=ax; y[u]+=ay; //懒标记 
	w[u]+=Sum(ax,ay,r-l+1);
}
inline void pushdown(int u,int L,int R)
{
	int mid=(L+R)>>1;
	maketag(u<<1,L,mid,x[u],y[u]);
	maketag(u<<1|1,mid+1,R,x[u],y[u]);
	x[u]=0,y[u]=0;
}
inline ll query(int u,int L,int R,int l,int r)
{
	if(in_range(L,R,l,r)) return w[u];
	else if(!outof_range(L,R,l,r))
	{
		int mid=(L+R)>>1;
		pushdown(u,L,R);
		return query(u<<1,L,mid,l,r)+query(u<<1|1,mid+1,R,l,r);
	}
	else return 0;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=n-1;i>0;i--) a[i+1]=a[i+1]-a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		cin>>opt;
		if(opt==1)
		{
			int l,r,k,d;
			cin>>l>>r>>k>>d;
			maketag(1,l,r,k,d);
		}
		else
		{
			int p;
			cin>>p;
			cout<<query(1,1,n,1,p)<<endl;
		}
	}
	return 0;
}

唔唔唔……睡螚邦邦吾?

2022/8/11 12:58
加载中...