四叉树求卡常
查看原帖
四叉树求卡常
713562
hahaxiang楼主2024/3/25 11:33
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,t;
struct TREE{
	int mx,tag;
	bool exist;
}tree[N*16];
inline int get_son(int nw,int to)
{
	return nw*4-2+to;
}
inline void build(int x,int lft,int rht,int up,int down)
{
	if(lft>rht||up>down)
	return;
	tree[x].exist=1;
	tree[x].tag=-1;
	if(lft==rht&&up==down)
	return;
	build(get_son(x,0),lft,(lft+rht)/2,up,(up+down)/2);
	build(get_son(x,1),(lft+rht)/2+1,rht,up,(up+down)/2);
	build(get_son(x,2),lft,(lft+rht)/2,(up+down)/2+1,down);
	build(get_son(x,3),(lft+rht)/2+1,rht,(up+down)/2+1,down);
	return;
} //预处理边界 
inline void update(int x)
{
	tree[x].mx=max(tree[x].mx,max(max(tree[get_son(x,0)].mx,tree[get_son(x,1)].mx),max(tree[get_son(x,2)].mx,tree[get_son(x,3)].mx)));
	return;
}
inline void pushdown(int x)
{
	if(tree[x].tag!=-1)
	{
		tree[get_son(x,0)].mx=tree[get_son(x,0)].tag=tree[x].tag;
		tree[get_son(x,1)].mx=tree[get_son(x,1)].tag=tree[x].tag;
		tree[get_son(x,2)].mx=tree[get_son(x,2)].tag=tree[x].tag;
		tree[get_son(x,3)].mx=tree[get_son(x,3)].tag=tree[x].tag;
		tree[x].tag=-1;
	}
	return;
}
inline int get(int x,int lft,int rht,int up,int down,int lft1,int rht1,int up1,int down1)
{
	if(tree[x].exist==0)
	return 0;
	if(rht<lft1||lft>rht1||down<up1||up>down1)
	return 0;
	if(lft>=lft1&&rht<=rht1&&up>=up1&&down<=down1)
	return tree[x].mx;
	pushdown(x);
	int s=0;
	s=max(s,get(get_son(x,0),lft,(lft+rht)/2,up,(up+down)/2,lft1,rht1,up1,down1));
	s=max(s,get(get_son(x,1),(lft+rht)/2+1,rht,up,(up+down)/2,lft1,rht1,up1,down1));
	s=max(s,get(get_son(x,2),lft,(lft+rht)/2,(up+down)/2+1,down,lft1,rht1,up1,down1));
	s=max(s,get(get_son(x,3),(lft+rht)/2+1,rht,(up+down)/2+1,down,lft1,rht1,up1,down1));
	update(x);
	return s;
}
inline void change(int x,int lft,int rht,int up,int down,int lft1,int rht1,int up1,int down1,int to)
{
	if(rht<lft1||lft>rht1||down<up1||up>down1)
	return;
	if(lft>=lft1&&rht<=rht1&&up>=up1&&down<=down1)
	{
		tree[x].mx=tree[x].tag=to;
		return;
	}
	pushdown(x);
	if(tree[get_son(x,0)].exist==1)
	change(get_son(x,0),lft,(lft+rht)/2,up,(up+down)/2,lft1,rht1,up1,down1,to);
	if(tree[get_son(x,1)].exist==1)
	change(get_son(x,1),(lft+rht)/2+1,rht,up,(up+down)/2,lft1,rht1,up1,down1,to);
	if(tree[get_son(x,2)].exist==1)
	change(get_son(x,2),lft,(lft+rht)/2,(up+down)/2+1,down,lft1,rht1,up1,down1,to);
	if(tree[get_son(x,3)].exist==1)
	change(get_son(x,3),(lft+rht)/2+1,rht,(up+down)/2+1,down,lft1,rht1,up1,down1,to);
	update(x);
	return;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>t;
	build(1,1,m,1,n);
	for(int i=1;i<=t;i++)
	{
		int d,s,w,x,y;
		cin>>d>>s>>w>>x>>y;
		int lst=get(1,1,m,1,n,x+1,x+d,y+1,y+s);
		change(1,1,m,1,n,x+1,x+d,y+1,y+s,lst+w);
	}
	cout<<tree[1].mx<<'\n';
	return 0;
}
2024/3/25 11:33
加载中...