有没有大佬帮忙看看(线段树的)
  • 板块学术版
  • 楼主dabawang
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/15 16:25
  • 上次更新2024/8/15 18:24:36
查看原帖
有没有大佬帮忙看看(线段树的)
371412
dabawang楼主2024/8/15 16:25

8WA 2RE P1438 无聊的数列

#include<bits/stdc++.h>
using namespace std;
#define N 4*1000100
struct shu
{
	int l,r,num,tag;
}t[N];
int s=0;
int a[N];
int a1[N];
void build(int i,int l,int r)
{
	t[i].l=l;
	t[i].r=r;
	if(l==r)
	  return ;
	int mid=(l+r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
}
int add(int i)
{
	if(t[i].l==t[i].r)
	  {
	  	t[i].num=a[t[i].r];
	  	return t[i].num;
	  }
	t[i].num=add(i*2)+add(i*2+1);
	return t[i].num;
}
void push(int i)
{
	if(t[i].tag>0)
	  {
	  	t[i*2].tag+=t[i].tag;
		t[i*2+1].tag+=t[i].tag;
		t[i*2].num+=t[i].tag*(t[i*2].r-t[i*2].l+1);
		t[i*2+1].num+=t[i].tag*(t[i*2+1].r-t[i*2+1].l+1);
		t[i].tag=0;
	  }
}
void quxiu(int i,int l,int r,int k)
{
	if(l<=t[i].l&&t[i].r<=r)
	  {
	  	t[i].num+=k*(t[i].r-t[i].l+1);
	  	t[i].tag+=k;
	  	return ;
	  }
	push(i);
	if(l<=t[i*2].r)
	  quxiu(i*2,l,r,k);
	if(t[i*2+1].l<=r)
	  quxiu(i*2+1,l,r,k);
	t[i].num=t[i*2].num+t[i*2+1].num; 
}
void danxiu(int i,int dis,int k)
{
	if(dis>t[i].r||dis<t[i].l)
	  return ;
	t[i].num+=k;
	if(t[i].l==t[i].r)
	  return ;
	push(i);
	if(dis<=t[i*2].r)
	  danxiu(i*2,dis,k);
	else if(t[i*2+1].l<=dis)
	  danxiu(i*2+1,dis,k);
	t[i].num=t[i*2].num+t[i*2+1].num; 
}
void qucha(int i,int l,int r)
{
	if(l<=t[i].l&&t[i].r<=r)
	  {
	  	s=s+t[i].num;
	  	return ;
	  }
	push(i);
	if(l<=t[i*2].r) 
	  qucha(i*2,l,r);
	if(t[i*2+1].l<=r)
	  qucha(i*2+1,l,r);
	t[i].num=t[i*2].num+t[i*2+1].num; 
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  cin>>a1[i];
	for(int i=1;i<=n;i++)
	  a[i]=a1[i]-a1[i-1];
	build(1,1,n);
	add(1);
	for(int i=1;i<=m;i++)
	  {
	  	int o;
	  	cin>>o;
	  	if(o==1)
	  	  {
	  	  	int l,r,k,d;
			cin>>l>>r>>k>>d;
			quxiu(1,l+1,r,d);
			danxiu(1,l,k);
			danxiu(1,r+1,-(k+d*(r-l)));
			}
		else if(o==2)
		  {
		  	s=0;
		  	int q;
		  	cin>>q;
		  	qucha(1,1,q);
		  	cout<<s<<endl;
		  }
	  }
}
2024/8/15 16:25
加载中...