社区讨论
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 条回复,欢迎继续交流。
正在加载回复...