不懂就问
  • 板块学术版
  • 楼主lrt_2008
  • 当前回复13
  • 已保存回复13
  • 发布时间2022/7/3 18:15
  • 上次更新2023/10/27 21:59:02
查看原帖
不懂就问
389476
lrt_2008楼主2022/7/3 18:15
#include<bits/stdc++.h>
#define gc getchar()
#define pc putchar
#define N 550000
#define R register
#define ll long long
using namespace std;
const int INF=2E9+233;
template<typename T>
inline void read(T &x)
{
    x=0;bool f=1;
    char c=gc;
    while(!isdigit(c)){if(c=='-')f=0;c=gc;}
    while(isdigit(c))
        x=(x<<1)+(x<<3)+(c-'0'),
        c=gc;
    x=f?x:-x;
    return ;
}
template<typename T>
void write(T x)
{
    if(x<0) pc('-'),x=-x;
    if(x>9) write(x/10);
    pc(x%10+'0');
    return ;
}
int n,m,a[N];
struct SegmentTree
{
	struct Node
	{
		int l, r;
		int mx, mx_, se, cnt; ll sum;
		int add1, add1_, add2, add2_;
	}tr[N<<2];
	#define lson(x) x<<1
	#define rson(x) x<<1|1
	void pushup(int rt)
	{
		tr[rt].sum=tr[lson(rt)].sum+tr[rson(rt)].sum;
		tr[rt].mx_=max(tr[lson(rt)].mx_, tr[rson(rt)].mx_);
		if (tr[lson(rt)].mx==tr[rson(rt)].mx)
		{
			tr[rt].mx=tr[lson(rt)].mx;
			tr[rt].se=max(tr[lson(rt)].se, tr[rson(rt)].se);
			tr[rt].cnt=tr[lson(rt)].cnt+tr[rson(rt)].cnt;
		}
		else if (tr[lson(rt)].mx>tr[rson(rt)].mx)
		{
			tr[rt].mx=tr[lson(rt)].mx;
			tr[rt].se=max(tr[lson(rt)].se, tr[rson(rt)].mx);
			tr[rt].cnt=tr[lson(rt)].cnt;
		}
		else
		{
			tr[rt].mx=tr[rson(rt)].mx;
			tr[rt].se=max(tr[lson(rt)].mx, tr[rson(rt)].se);
			tr[rt].cnt=tr[rson(rt)].cnt;
		}
	}
	void update(int rt, int k1, int k1_, int k2, int k2_)
	{
		tr[rt].sum+=1ll*k1*tr[rt].cnt+1ll*k2*(tr[rt].r-tr[rt].l+1-tr[rt].cnt);
		tr[rt].mx_=max(tr[rt].mx_, tr[rt].mx+k1_);
		tr[rt].add1_=max(tr[rt].add1_, tr[rt].add1+k1_);
		tr[rt].mx+=k1, tr[rt].add1+=k1;
		tr[rt].add2_=max(tr[rt].add2_, tr[rt].add2+k2_);
		if (tr[rt].se!=-INF) tr[rt].se+=k2;
		tr[rt].add2+=k2;
	}
	void pushdown(int rt)
	{
		int tmp=max(tr[lson(rt)].mx, tr[rson(rt)].mx);
		if (tr[lson(rt)].mx==tmp)
			update(lson(rt), tr[rt].add1, tr[rt].add1_, tr[rt].add2, tr[rt].add2_);
		else update(lson(rt), tr[rt].add2, tr[rt].add2_, tr[rt].add2, tr[rt].add2_);
		if (tr[rson(rt)].mx==tmp)
			update(rson(rt), tr[rt].add1, tr[rt].add1_, tr[rt].add2, tr[rt].add2_);
		else update(rson(rt), tr[rt].add2, tr[rt].add2_, tr[rt].add2, tr[rt].add2_);
		tr[rt].add1=tr[rt].add1_=tr[rt].add2=tr[rt].add2_=0;
	}
	void build(int rt, int l, int r)
	{
		tr[rt].l=l, tr[rt].r=r;
		tr[rt].add1=tr[rt].add1_=tr[rt].add2=tr[rt].add2_=0;
		if (l==r)
		{
			tr[rt].sum=tr[rt].mx_=tr[rt].mx=a[l];
			tr[rt].se=-INF, tr[rt].cnt=1;
			return;
		}
		int mid=l+r>>1;
		build(lson(rt), l, mid);
		build(rson(rt), mid+1, r);
		pushup(rt);
	}
	void update_add(int rt, int l, int r, int k)
	{
		if (tr[rt].l>r||tr[rt].r<l) return;
		if (l<=tr[rt].l&&tr[rt].r<=r)
			{ update(rt, k, k, k, k); return; }
		pushdown(rt);
		update_add(lson(rt), l, r, k), update_add(rson(rt), l, r, k);
		pushup(rt);
	}
	void update_min(int rt, int l, int r, int k)
	{
		if (tr[rt].l>r||tr[rt].r<l||k>=tr[rt].mx) return;
		if (l<=tr[rt].l&&tr[rt].r<=r&&k>tr[rt].se)
			{ update(rt, k-tr[rt].mx, k-tr[rt].mx, 0, 0); return; }
		pushdown(rt);
		update_min(lson(rt), l, r, k), update_min(rson(rt), l, r, k);
		pushup(rt);
	}
	ll query_sum(int rt, int l, int r)
	{
		if (tr[rt].l>r||tr[rt].r<l) return 0;
		if (l<=tr[rt].l&&tr[rt].r<=r) return tr[rt].sum;
		pushdown(rt);
		return query_sum(lson(rt), l, r)+query_sum(rson(rt), l, r);
	}
	int query_mx(int rt, int l, int r)
	{
		if (tr[rt].l>r||tr[rt].r<l) return -INF;
		if (l<=tr[rt].l&&tr[rt].r<=r) return tr[rt].mx;
		pushdown(rt);
		return max(query_mx(lson(rt), l, r), query_mx(rson(rt), l, r));
	}
	int query_mx_(int rt, int l, int r)
	{
		if (tr[rt].l>r||tr[rt].r<l) return -INF;
		if (l<=tr[rt].l&&tr[rt].r<=r) return tr[rt].mx_;
		pushdown(rt);
		return max(query_mx_(lson(rt), l, r), query_mx_(rson(rt), l, r));
	}
	#undef lson
	#undef rson
} sgt;
int main()
{
    read(n),read(m);
	for(R int i=1; i<=n; i++)
        read(a[i]);
	sgt.build(1,1,n);
	while (m--)
	{
		int op,l,r,k;
        read(op);read(l);read(r);
        if(op==1) read(k),sgt.update_add(1,l,r,k);
        if(op==2) read(k),sgt.update_min(1,l,r,k);
        if(op==3) write(sgt.query_sum(1,l,r)),pc('\n');
        if(op==4) write(sgt.query_mx(1,l,r)),pc('\n');
        if(op==5) write(sgt.query_mx_(1,l,r)),pc('\n');
	}
	return 0;
}

这个是P6242的AC代码

然而加上这句就8TLE:

#define max(a,b) (a>b?a:b)

请问这句话没有原来的max快吗?

2022/7/3 18:15
加载中...