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 同学在一起也挺开心的,朴素且美好。

posted @ 2024-01-19 21:26  HS_xh  阅读(36)  评论(4)    收藏  举报
init();