社区讨论

63pts 求助

P3792由乃与大母神原型和偶像崇拜参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lobzg9s4
此快照首次捕获于
2023/10/30 05:28
2 年前
此快照最后确认于
2023/11/04 10:44
2 年前
查看原帖
维护最大值最小值和以及平方和
平方和自然溢出
CPP
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;

const int N=5e5+11;

int n,m;
int arr[N];
int treemax[N<<2],treemin[N<<2];
ll treesum[N<<2];
ull treesumx[N<<2];

#define lnode node<<1
#define rnode node<<1|1
#define DEFMID int mid=(start+end)>>1

void push_up(int node)
{
	treemax[node]=max(treemax[lnode],treemax[rnode]);
	treemin[node]=min(treemin[rnode],treemin[lnode]);
	treesum[node]=treesum[lnode]+treesum[rnode];
	treesumx[node]=treesumx[lnode]+treesumx[rnode];
}
void build(int node,int start,int end)
{
	if(start==end)
	{
		treemax[node]=treemin[node]=treesum[node]=arr[start];
		treesumx[node]=(ull)arr[start]*arr[start];
		return ;
	}
	DEFMID;
	build(lnode,start,mid);
	build(rnode,mid+1,end);
	push_up(node);
}

void update(int node,int start,int end,int x,int val)
{
	if(start==end) 
	{
		arr[start]=treemax[node]=treemin[node]=treesum[node]=val;
		treesumx[node]=(ull)val*val;
		return ;
	}
	DEFMID;
	if(x<=mid) update(lnode,start,mid,x,val);
	else update(rnode,mid+1,end,x,val);
	push_up(node);
}

int querymax(int node,int start,int end,int l,int r)
{
	if(l<=start&&end<=r) return treemax[node];
	DEFMID;
	int ans=-1e9;
	if(l<=mid) ans=max(ans,querymax(lnode,start,mid,l,r));
	if(r>mid) ans=max(ans,querymax(rnode,mid+1,end,l,r));
	push_up(node);
	return ans;
}

int querymin(int node,int start,int end,int l,int r)
{
	if(l<=start&&end<=r) return treemin[node];
	DEFMID;
	int ans=1e9;
	if(l<=mid) ans=min(ans,querymin(lnode,start,mid,l,r));
	if(r>mid) ans=min(ans,querymin(rnode,mid+1,end,l,r));
	push_up(node);
	return ans;
}

ll querysum(int node,int start,int end,int l,int r)
{
	if(l<=start&&end<=r) return treesum[node];
	DEFMID;
	ll ans=0;
	if(l<=mid) ans+=querysum(lnode,start,mid,l,r);
	if(r>mid) ans+=querysum(rnode,mid+1,end,l,r);
	push_up(node);
	return ans;
}

ull querysumx(int node,int start,int end,int l,int r)
{
	if(l<=start&&end<=r) return treesumx[node];
	DEFMID;
	ull ans=0;
	if(l<=mid) ans+=querysumx(lnode,start,mid,l,r);
	if(r>mid) ans+=querysumx(rnode,mid+1,end,l,r);
	push_up(node);
	return ans;
}

ll Sum(int x)
{
	return (ull)(x*x+x)/2LL;
}

ull Sumx(int x)
{
	return (ull)x*(x+1)*(2*x+1)/6LL;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&arr[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int op;
		scanf("%d",&op);
		if(op==1)
		{
			int x,val;
			scanf("%d%d",&x,&val);
			update(1,1,n,x,val);
		}
		if(op==2)
		{
			int l,r;
			scanf("%d%d",&l,&r);
			int maxx=querymax(1,1,n,l,r);
			int minn=querymin(1,1,n,l,r);
			ull sumx=querysumx(1,1,n,l,r);
			ll sum=querysum(1,1,n,l,r);
			if(maxx-minn==r-l && (Sum(maxx)-Sum(minn-1)==sum) && ((ull)Sumx(maxx)-Sumx(minn-1)==sumx))
				printf("damushen\n");
			else printf("yuanxing\n");
		}
	}
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...