社区讨论

define max致TLE?

学术版参与者 3已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@m52f957c
此快照首次捕获于
2024/12/24 20:07
去年
此快照最后确认于
2025/11/04 12:23
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define max(x,y) x<y?y:x
#define min(x,y) x>y?y:x
#define mmt(x,val) memset(x,val,sizeof(x))
// #define int long long
using namespace std;
const int N=4050;
char buf[1 << 20], *p1, *p2;
#define gc()                                                                 \
	(p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) \
		? EOF                                                                \
       : *p1++)
inline int read()
{
    int x=0,f=1;
    char c=gc();
    while (c<'0' || c>'9')
    {
        if (c=='-')  f=-1;
        c=gc();
    }
    while (c>='0' && c<='9')
    {
        x=x*10+c-'0';
        c=gc();
    }
    return x*f;
}
int n,m;
struct lst{
	int s[N],tg[N];
	void change(int rt,int l,int r,int x,int y,int z)
	{
		if(x>r or y<l)
		{
			return;
		}
		s[rt]=max(s[rt],z);
		if(l>=x and y>=r)
		{
			tg[rt]=max(tg[rt],z);
			return;
		}
		int mid=(l+r)>>1;
		change(rt<<1,l,mid,x,y,z);
		change(rt<<1|1,mid+1,r,x,y,z);
	}
	int query(int rt,int l,int r,int x,int y)
	{
		if(x>r or y<l)
		{
			return 0;
		}
		if(l>=x and y>=r)
		{
			return s[rt];
		}
		int ss=tg[rt];
		int mid=(l+r)>>1;
		ss=max(query(rt<<1,l,mid,x,y),ss);
		ss=max(query(rt<<1|1,mid+1,r,x,y),ss);
		return ss;
	}
}s[N],tg[N];
void change(int rt,int l,int r,int xa,int ya,int xb,int yb,int z)
{
	if(l>ya or r<xa)
	{
		return;
	}
	s[rt].change(1,1,m,xb,yb,z);
	if(l>=xa and ya>=r)
	{
		tg[rt].change(1,1,m,xb,yb,z);
		return;
	}
	int mid=(l+r)>>1;
	change(rt<<1,l,mid,xa,ya,xb,yb,z);
	change(rt<<1|1,mid+1,r,xa,ya,xb,yb,z);
}
int query(int rt,int l,int r,int xa,int ya,int xb,int yb)
{
	if(l>ya or r<xa)
	{
		return -1e9;
	}
	if(l>=xa and ya>=r)
	{
		return s[rt].query(1,1,m,xb,yb);
	}
	int ss=tg[rt].query(1,1,m,xb,yb);
	int mid=(l+r)>>1;
	ss=max(query(rt<<1,l,mid,xa,ya,xb,yb),ss);
	ss=max(query(rt<<1|1,mid+1,r,xa,ya,xb,yb),ss);
	return ss;
}
int q;
signed main()
{
	// cin>>n>>m>>q;
	n=read(),m=read(),q=read();
	while(q--)
	{
		int a,b,c,d,e;
		a=read(),b=read(),c=read(),d=read(),e=read();
		c+=query(1,1,n,d+1,d+a,e+1,e+b);
		change(1,1,n,d+1,d+a,e+1,e+b,c);
	}
	printf("%d\n",query(1,1,n,1,n,1,m));
}
/*
7 5 4
4 3 2 0 0
3 3 1 3 0
7 1 2 0 3
2 3 3 2 2
*/
CPP
#include<bits/stdc++.h>
// #define max(x,y) x<y?y:x
// #define min(x,y) x>y?y:x
#define mmt(x,val) memset(x,val,sizeof(x))
// #define int long long
using namespace std;
const int N=4050;
char buf[1 << 20], *p1, *p2;
#define gc()                                                                 \
	(p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) \
		? EOF                                                                \
       : *p1++)
inline int read()
{
    int x=0,f=1;
    char c=gc();
    while (c<'0' || c>'9')
    {
        if (c=='-')  f=-1;
        c=gc();
    }
    while (c>='0' && c<='9')
    {
        x=x*10+c-'0';
        c=gc();
    }
    return x*f;
}
int n,m;
struct lst{
	int s[N],tg[N];
	void change(int rt,int l,int r,int x,int y,int z)
	{
		if(x>r or y<l)
		{
			return;
		}
		s[rt]=max(s[rt],z);
		if(l>=x and y>=r)
		{
			tg[rt]=max(tg[rt],z);
			return;
		}
		int mid=(l+r)>>1;
		change(rt<<1,l,mid,x,y,z);
		change(rt<<1|1,mid+1,r,x,y,z);
	}
	int query(int rt,int l,int r,int x,int y)
	{
		if(x>r or y<l)
		{
			return 0;
		}
		if(l>=x and y>=r)
		{
			return s[rt];
		}
		int ss=tg[rt];
		int mid=(l+r)>>1;
		ss=max(query(rt<<1,l,mid,x,y),ss);
		ss=max(query(rt<<1|1,mid+1,r,x,y),ss);
		return ss;
	}
}s[N],tg[N];
void change(int rt,int l,int r,int xa,int ya,int xb,int yb,int z)
{
	if(l>ya or r<xa)
	{
		return;
	}
	s[rt].change(1,1,m,xb,yb,z);
	if(l>=xa and ya>=r)
	{
		tg[rt].change(1,1,m,xb,yb,z);
		return;
	}
	int mid=(l+r)>>1;
	change(rt<<1,l,mid,xa,ya,xb,yb,z);
	change(rt<<1|1,mid+1,r,xa,ya,xb,yb,z);
}
int query(int rt,int l,int r,int xa,int ya,int xb,int yb)
{
	if(l>ya or r<xa)
	{
		return -1e9;
	}
	if(l>=xa and ya>=r)
	{
		return s[rt].query(1,1,m,xb,yb);
	}
	int ss=tg[rt].query(1,1,m,xb,yb);
	int mid=(l+r)>>1;
	ss=max(query(rt<<1,l,mid,xa,ya,xb,yb),ss);
	ss=max(query(rt<<1|1,mid+1,r,xa,ya,xb,yb),ss);
	return ss;
}
int q;
signed main()
{
	// cin>>n>>m>>q;
	n=read(),m=read(),q=read();
	while(q--)
	{
		int a,b,c,d,e;
		a=read(),b=read(),c=read(),d=read(),e=read();
		c+=query(1,1,n,d+1,d+a,e+1,e+b);
		change(1,1,n,d+1,d+a,e+1,e+b,c);
	}
	printf("%d\n",query(1,1,n,1,n,1,m));
}
/*
7 5 4
4 3 2 0 0
3 3 1 3 0
7 1 2 0 3
2 3 3 2 2
*/

回复

6 条回复,欢迎继续交流。

正在加载回复...