1.19
教练:精彩。
距离退役还有 2 天🤣🤣🤣,周日等着被刷下去吧🤣🤣🤣
但是为了苟延残喘一下体验下数据结构的快乐,写了一晚上线段树。(两道)
几道题
简单区间查询,写一个最大值最小值的查询作差即可。
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls p<<1
#define rs p<<1|1
int x,y,n,m;
inline int read()
{
int w=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){ch=getchar();if(ch=='-')w=-1;};
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();};
return w*x;
}
const int N=1e5;
int a[N];
struct tree
{
int l,r;
int pre,max,min;
inline int mid()
{
return (l+r)>>1;
}
}t[4*N];
inline void bulid(int p,int l,int r)
{
t[p].l=l,t[p].r=r;
if(l==r)
{
t[p].max=t[p].min=a[l];
return;
}
int mid=t[p].mid();
bulid(ls,l,mid);
bulid(rs,mid+1,r);
t[p].max=max(t[ls].max,t[rs].max);
t[p].min=min(t[ls].min,t[rs].min);
}
inline int find_max(int p,int l,int r)
{
if(l<=t[p].l && r>=t[p].r) return t[p].max;
int mid=t[p].mid();
int cnt=-1;
if(l<=mid) cnt=max(cnt,find_max(ls,x,y));
if(r>=mid+1) cnt=max(cnt,find_max(rs,x,y));
return cnt;
}
inline int find_min(int p,int l,int r)
{
if(l<=t[p].l && r>=t[p].r) return t[p].min;
int mid=t[p].mid();
int cnt=2147483647;
if(l<=mid) cnt=min(cnt,find_min(ls,x,y));
if(r>=mid+1) cnt=min(cnt,find_min(rs,x,y));
return cnt;
}
signed main()
{
n=read(),m=read();
for(int i=1;i<=n;++i)
cin>>a[i];
bulid(1,1,n);
for(int i=1;i<=m;++i)
{
cin>>x>>y;
cout<<find_max(1,x,y)-find_min(1,x,y)<<endl;
}
}
区间修改区间查询,修改为 \(\sqrt n\)
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls p<<1
#define rs p<<1|1
int n,m;
int opt,x,y;
inline int read()
{
int w=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){ch=getchar();if(ch=='-')w=-1;};
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();};
return w*x;
}
const int N=1e5;
int a[N];
struct tree
{
int l,r;
int sum,max;
inline int mid()
{
return (l+r)>>1;
}
inline int len()
{
return (r-l+1);
}
}t[4*N];
inline void push_up(int p)
{
t[p].sum=t[ls].sum+t[rs].sum;
t[p].max=max(t[ls].max,t[rs].max);
}
inline void bulid(int p,int l,int r)
{
if(l>r) swap(l,r);
t[p].l=l,t[p].r=r;
if(l==r)
{
t[p].sum=t[p].max=a[l];
return;
}
int mid=t[p].mid();
bulid(ls,l,mid);
bulid(rs,mid+1,r);
push_up(p);
}
inline int find(int p,int x,int y)
{
if(x>y) swap(x,y);
if(x<=t[p].l && y>=t[p].r) return t[p].sum;
int mid=t[p].mid();
int ans=0;
if(x<=mid) ans+=find(ls,x,y);
if(y>=mid+1) ans+=find(rs,x,y);
return ans;
}
inline void change(int p,int x,int y)
{
if(x>y) swap(x,y);
if(t[p].max<=1) return;
if((t[p].len())==1)
{
t[p].sum=t[p].max=sqrt(t[p].sum);
return;
}
int mid=t[p].mid();
if(x<=mid) change(ls,x,y);
if(y>mid) change(rs,x,y);
push_up(p);
}
signed main()
{
n=read();
for(int i=1;i<=n;++i)
a[i]=read();
bulid(1,1,n);
m=read();
for(int i=1;i<=m;++i)
{
opt=read(),x=read(),y=read();
if(opt==2) change(1,x,y);
else
cout<<find(1,x,y)<<endl;
}
}
但是洛谷数据加强了过不去,恼!
没有学科学术啦,最近都在复习,顶多写写收集分析但是没意义。
写的好简短啊😓😓😓,可能因为我最近天天不来都没啥魔怔事了吧,跟 whk 同学在一起也挺开心的,朴素且美好。

浙公网安备 33010602011771号