为什么只对了个样例!QWQ!
查看原帖
为什么只对了个样例!QWQ!
261156
Sun_Qixuan楼主2020/8/5 22:02

一下是代码,请各位大佬多多指教……

代码风格不太好……

//线段树模板 写于2020年8月5日20:04:09 

#include <bits/stdc++.h>

using namespace std;

const long long maxn=800001;

long long sum[maxn],shu[maxn],tep[maxn];

void build(long long l,long long r,long long k)
{
	if(l==r) 
	{
		sum[k]=shu[l];return;
	}
	
	long long mid=(l+r)/2;
	
	build(l,mid,2*k);build(mid+1,r,2*k+1);
	
	sum[k]=sum[2*k]+sum[2*k+1];
}

void take_tep(long long l,long long r,long long v,long long k)
{
	tep[k]=v;
	
	sum[k]+=(r-l+1)*v;
	
	return;
}

void push_down(long long l,long long r,long long k,long long mid)
{
	if(tep[k]==0) return;
	
	take_tep(l,mid,tep[k],2*k);
	
	take_tep(mid+1,r,tep[k],2*k+1);
	
	tep[k]=0;
}

long long apd_get(long long l,long long r,long long getl,long long getr,long long k)
{
	if(l>=getl&&r<=getr)
	{
		return sum[k];
	}
	
	long long mid=(l+r)/2,cnt=0;
	
	push_down(l,r,k,mid);
	
	if(getl<=mid) cnt+=apd_get(l,mid,getl,getr,2*k);
	
	if(getr>mid) cnt+=apd_get(mid+1,r,getl,getr,2*k+1);
	
	return cnt;
}

void apd_set(long long l,long long r,long long getl,long long getr,long long k,long long v)
{
	if(l>=getl&&r<=getr)
	{
		take_tep(l,r,v,k);return;
	}
	
	long long mid=(l+r)/2;
	
	push_down(l,r,k,mid);
	
	if(getl<=mid) apd_set(l,mid,getl,getr,2*k,v);
	
	if(getr>mid) apd_set(mid+1,r,getl,getr,2*k+1,v);
	
	sum[k]=sum[2*k]+sum[2*k+1];
}

int main()
{
	long long n,m;cin>>n>>m;
	
	for(long long i=1;i<=n;i++)
	{
		cin>>shu[i];
	}
	
	build(1,n,1);
	
	for(long long i=1;i<=m;i++)
	{
		long long ppp;cin>>ppp;
		
		if(ppp==1)
		{
			long long x,y,k;cin>>x>>y>>k;
			
			apd_set(1,n,x,y,1,k);
		}
		
		if(ppp==2)
		{
			long long x,y;cin>>x>>y;
			
			cout<<apd_get(1,n,x,y,1)<<endl;
		}
	}
} 

QWQQWQ!求助!本蒟蒻求助!

2020/8/5 22:02
加载中...