关于一个蒟蒻的蒟蒻的线段树代码
  • 板块学术版
  • 楼主Name1
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/5/25 17:16
  • 上次更新2023/10/28 00:38:59
查看原帖
关于一个蒟蒻的蒟蒻的线段树代码
648660
Name1楼主2022/5/25 17:16

这两篇代码,一道是P4513,一道是P2824,主要是一直暴,只求看看为什么暴,找了一下午了,

#include<iostream>
#include<cstdio>
#define ql x<<1
#define qr x<<1|1
#define mid (l+r)>>1
using namespace std;
const int N=5e5+10;
int n,m,a[N];
struct node
{
	int l,r,c,sum,lsum,rsum;
}g[N<<1];
inline int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
	return x*f;
}
void pushup(int x)
{
	if(g[ql].rsum<0&&g[qr].lsum<0)
		g[x].sum=max(g[ql].rsum,g[qr].lsum);
	else
	{
		g[x].sum=0;
		if(g[ql].rsum>0)g[x].sum+=g[ql].rsum;
		if(g[qr].lsum>0)g[x].sum+=g[qr].lsum;
	}
	g[x].c=g[ql].c+g[qr].c;
	g[x].lsum=max(g[ql].lsum,g[ql].c+g[qr].lsum);
	g[x].rsum=max(g[qr].rsum,g[qr].c+g[ql].rsum);
	g[x].sum=max(g[ql].rsum+g[qr].lsum,max(g[qr].sum,g[ql].sum));
}
void build(int x,int l,int r)
{
	if(l==r)
	{
		g[x]=(node){l,r,a[l],a[l],a[l]};
		return;
	}
	build(ql,l,mid);
	build(qr,mid+1,r);
	g[x].l=l,g[x].r=r;
	pushup(x);
}
void updata(int x,int y,int v)
{
	int l=g[x].l,r=g[x].r;
	if(l==r)
	{
		g[x]=(node){l,r,v,v,v};
		return;
	}
	if(y<=mid)updata(ql,y,v);
	else updata(qr,y,v);
	pushup(x);
}
int query(int x,int ll,int rr,int flag)
{
	int l=g[x].l,r=g[x].r;
	if(ll==l&&rr==r)
	{
		if(flag==0)return g[x].sum;
		else if(flag==1) return g[x].rsum;
		else return g[x].lsum;
	}
	if(ll<=mid&&rr>mid)return query(ql,ll,mid,1)+query(qr,mid+1,rr,2);
	else if(ll<=mid)return query(ql,ll,rr,1);
	else return query(qr,ll,rr,2);
}
int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
	while(m--)
	{
		int op=read(),a=read(),b=read();
		if(op==1)
		{
			if(a>b)swap(a,b);
			printf("%d\n",query(1,a,b,0));
		}
		else 
		updata(1,a,b);
	}
	return 0;
}
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int n,m,p,a[N],sign[N],L[N],R[N],ans,g[N<<2],lazy[N<<2];
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
    return x*f;
}
void build(int x,int l,int r,int tot)
{
    if(l==r)
    {
        g[x]=(a[l]>=tot);
        lazy[x]=0;
        return;
    }
    int mid=(l+r)>>1;
    build(x<<1,l,mid,tot);
    build(x<<1|1,mid+1,r,tot);
    g[x]=g[x<<1]+g[x<<1|1],lazy[x]=0;
}
void pushdown(int x,int l,int r,int mid)
{
    if(!lazy[x])return;
    lazy[x<<1]=lazy[x<<1|1]=lazy[x];
    if(lazy[x]==1)g[x<<1]=mid-l+1,g[x<<1|1]=r-mid;
    else g[x<<1]=g[x<<1|1]=0;
    lazy[x]=0;
}
int query(int x,int l,int r,int ql,int qr)
{
    if(ql==l&&r==qr)return g[x];
    int mid=(l+r)>>1;
    pushdown(x,l,r,mid);
    if(ql<=mid&&qr>mid)return query(x<<1,l,mid,ql,mid)+query(x<<1|1,mid+1,r,mid+1,qr);
    else if(qr<=mid)return query(x<<1,l,mid,ql,qr);
    else return query(x<<1|1,mid+1,r,ql,qr);
}
void updata(int x,int l,int r,int ql,int qr,int val)
{
    if(ql==l&&r==qr)
    {
        g[x]=(r-l+1)*val;lazy[x]=val?1:-1;
        return;
    }
    int mid=(l+r)>>1;
    pushdown(x,l,r,mid);
    if(ql<=mid&&qr>mid)
    {
        updata(x<<1,l,mid,ql,mid,val);
        updata(x<<1|1,mid+1,r,mid+1,qr,val);
    }
    else if(qr<=mid)updata(x<<1,l,mid,ql,qr,val);
    else updata(x<<1|1,mid+1,r,ql,qr,val);
    g[x]=g[x<<1]+g[x<<1|1];
}
int check(int x)
{
    build(1,1,n,x);
    for(int i=1;i<=m;i++)
    {
        int l=L[i],r=R[i];int tot=query(1,1,n,l,r);
        if(sign[x]==0)
        {
            updata(1,1,n,l,r-tot,0);
            updata(1,1,n,r-tot+1,r,1);
        }
        else 
        {
            updata(1,1,n,l,l+tot-1,1);
            updata(1,1,n,l+tot,r,0);
        }
    }
    return query(1,1,n,p,p);
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    for(int i=1;i<=m;i++)sign[i]=read(),L[i]=read(),R[i]=read();
    p=read();
    int ll = 1, rr = n, midd;
    while(ll<=rr){
        midd=(ll+rr)>>1;
        if(check(midd))ans=midd,ll=midd+1;else rr=midd-1;
    }
    printf("%d",ans);
    return 0;
}
2022/5/25 17:16
加载中...