define max致TLE?
  • 板块学术版
  • 楼主Resonate
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/12/24 20:06
  • 上次更新2024/12/25 10:50:02
查看原帖
define max致TLE?
753553
Resonate楼主2024/12/24 20:06

TLE:

#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
*/

ac:

#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
*/
2024/12/24 20:06
加载中...