bzoj 4066: 简单题

Description

你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作:

 

命令

参数限制

内容

1 x y A

1<=x,y<=N,A是正整数

将格子x,y里的数字加上A

2 x1 y1 x2 y2

1<=x1<= x2<=N

1<=y1<= y2<=N

输出x1 y1 x2 y2这个矩形内的数字和

3

终止程序

Input

输入文件第一行一个正整数N。
接下来每行一个操作。每条命令除第一个数字之外,
均要异或上一次输出的答案last_ans,初始时last_ans=0。

Output

对于每个2操作,输出一个对应的答案。

Sample Input

4
1 2 3 3
2 1 1 3 3
1 1 1 1
2 1 1 0 7
3

Sample Output

3
5

HINT

数据规模和约定

1<=N<=500000,操作数不超过200000个,内存限制20M,保证答案在int范围内并且解码之后数据仍合法。

样例解释见OJ2683


新加数据一组,但未重测----2015.05.24

神TM加一组数据但未重测。特意加了一组卡不重构人的数据

kd-tree板子题,直接维护即可

重构的话我没用那种标准版的替罪羊树重构

设置了一个阀值,点数每次大于这个阀值的k倍就暴力重构一次

总觉得这么做有点不科学

----------------------------------------------------------------------------------------

各种被卡调了整整三天,一开始先弄了个动态加点的二维树套树,结果空间爆炸

各种姿势写kd-tree各种挂

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
struct tree
{
	int min[2],max[2],p[2];
	int ll,rr;
	int s,x;
}tr[200001];
int tot;
int cmpd,rt;
inline bool cmp(tree x,tree y)
{
	return x.p[cmpd]<y.p[cmpd]||x.p[cmpd]==y.p[cmpd]&&x.p[!cmpd]<y.p[!cmpd];
}
inline int min(int x,int y) 
{
	if(x<y)
		return x;
	return y;
}
inline int max(int x,int y) 
{
	if(x>y)
		return x;
	return y;
}
inline void up(int p)
{
	int L=tr[p].ll,R=tr[p].rr;
	if(L!=0)
	{
		tr[p].min[0]=min(tr[L].min[0],tr[p].min[0]); 
		tr[p].min[1]=min(tr[L].min[1],tr[p].min[1]);
		tr[p].max[0]=max(tr[L].max[0],tr[p].max[0]);
		tr[p].max[1]=max(tr[L].max[1],tr[p].max[1]);
	}
	if(R!=0)
	{
		tr[p].min[0]=min(tr[R].min[0],tr[p].min[0]);
		tr[p].min[1]=min(tr[R].min[1],tr[p].min[1]);
		tr[p].max[0]=max(tr[R].max[0],tr[p].max[0]);
		tr[p].max[1]=max(tr[R].max[1],tr[p].max[1]);
	}
	tr[p].s=tr[L].s+tr[R].s+tr[p].x;
}
inline int build(int l,int r,int d)
{
	int mid=(l+r)/2;
	cmpd=d;
	nth_element(tr+l,tr+mid,tr+r+1,cmp);
	tr[mid].min[0]=tr[mid].p[0];
	tr[mid].min[1]=tr[mid].p[1];
	tr[mid].max[0]=tr[mid].p[0];
	tr[mid].max[1]=tr[mid].p[1];
//	tr[mid].s=0;
	if(l<mid)
		tr[mid].ll=build(l,mid-1,!d);
	else
		tr[mid].ll=0;
	if(r>mid)
		tr[mid].rr=build(mid+1,r,!d);
	else
		tr[mid].rr=0;
	up(mid);
	return mid;
}
int x1[2];
inline int add(int p,int x,int y,int d,int xx)
{
	if(p==0)
	{
		tot++;
		tr[tot].min[0]=tr[tot].max[0]=tr[tot].p[0]=x;
		tr[tot].min[1]=tr[tot].max[1]=tr[tot].p[1]=y;
		tr[tot].s=xx;
		tr[tot].x=xx;
		return tot;
	}
	if(tr[p].p[0]==x&&tr[p].p[1]==y)
	{
		tr[p].s+=xx;
		tr[p].x+=xx;
		return p;
	}
	x1[0]=x;
	x1[1]=y;
	if(x<tr[p].min[0])
		tr[p].min[0]=x;
	else if(x>tr[p].max[0])
		tr[p].max[0]=x;
	if(y<tr[p].min[1])
		tr[p].min[1]=y;
	else if(y>tr[p].max[1])
		tr[p].max[1]=y;
	if(x1[d]<=tr[p].p[d])
		tr[p].ll=add(tr[p].ll,x1[0],x1[1],!d,xx);
	else
		tr[p].rr=add(tr[p].rr,x1[0],x1[1],!d,xx);
	up(p);
	return p;
}
inline int ask(int p,int xx1,int yy1,int xx2,int yy2,int d)
{
	if(tr[p].s==0||p==0)
		return 0;
	if(xx1<=tr[p].min[0]&&yy1<=tr[p].min[1]&&tr[p].max[0]<=xx2&&tr[p].max[1]<=yy2)
		return tr[p].s;
	int x1[2],x2[2];
	x1[0]=xx1;
	x1[1]=yy1;
	x2[0]=xx2;
	x2[1]=yy2;
	int L=tr[p].ll,R=tr[p].rr;
	int ans=0;
	if(xx1<=tr[p].p[0]&&tr[p].p[0]<=xx2&&yy1<=tr[p].p[1]&&tr[p].p[1]<=yy2)
		ans+=tr[p].x;
	if(L&&tr[L].max[0]>=x1[0]&&tr[L].min[0]<=x2[0]&&tr[L].max[1]>=x1[1]&&tr[L].min[1]<=x2[1])
		if(x1[d]<=tr[p].p[d])
			ans+=ask(L,xx1,yy1,xx2,yy2,!d);
	if(R&&tr[R].max[0]>=x1[0]&&tr[R].min[0]<=x2[0]&&tr[R].max[1]>=x1[1]&&tr[R].min[1]<=x2[1])
		if(x2[d]>=tr[p].p[d])
			ans+=ask(R,xx1,yy1,xx2,yy2,!d);
	return ans;
}
inline int read()
{
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x;
}
struct quest
{
	int x;
	int x1,y1,x2,y2;
	int xx;
}xt[200001];
int main()
{
//	freopen("data.in","r",stdin); 
//	freopen("data.out","w",stdout); 
	int n;
	n=read();
	int x;
	int x1,y1,x2,y2;
	n=0;
	int m=0;
	x=read();
	int rt=0;
	tot=0;
	int last_ans=0; 
	while(x!=3)
	{
		if(x==1)
		{
			m++;
			xt[m].x=x;
			xt[m].x1=read();
			xt[m].y1=read();
			xt[m].x2=read();
		}
		else
		{
			m++;
			xt[m].x=x;
			xt[m].x1=read();
			xt[m].y1=read();
			xt[m].x2=read();
			xt[m].y2=read();
			n++;
		}
		scanf("%d",&x);
	}
	int nt=(int)sqrt((double)n*log2((double)n))+1,i;
	nt*=2;
	for(i=1;i<=m;i++)
	{
		if(xt[i].x==1)
		{
			x1=xt[i].x1^last_ans;
			y1=xt[i].y1^last_ans;
			x2=xt[i].x2^last_ans;
			add(rt,x1,y1,0,x2);
			if(rt==0)
				rt=1;
			if(nt!=0&&tot%nt==0)
				rt=build(1,tot,0);
		} 
		else
		{
			x1=xt[i].x1^last_ans;
			y1=xt[i].y1^last_ans;
			x2=xt[i].x2^last_ans;
			y2=xt[i].y2^last_ans;
			last_ans=ask(rt,x1,y1,x2,y2,0);
			printf("%d\n",last_ans);
		}
		//last_ans=0;
	}
	return 0;
}


内容概要:该论文聚焦于6G通信中20-100GHz频段的电磁场(EMF)暴露评估问,提出了一种基于自适应可重构架构神经网络(RAWA-NN)的预测框架。该框架通过集成权重分析模块和优化模块,能够自动优化网络超参数,显著减少训练时间。模型使用70%的前臂数据进行训练,其余数据用于测试,并用腹部和股四头肌数据验证模型泛化能力。结果显示,该模型在不同参数下的相对差异(RD)在前臂低于2.6%,其他身体部位低于9.5%,可有效预测皮肤表面的温升和吸收功率密度(APD)。此外,论文还提供了详细的代码实现,涵盖数据预处理、权重分析模块、自适应优化模块、RAWA-NN模型构建及训练评估等内容。 适合人群:从事电磁兼容性研究、6G通信技术研发以及对神经网络优化感兴趣的科研人员和工程师。 使用场景及目标:①研究6G通信中高频段电磁暴露对人体的影响;②开发更高效的电磁暴露评估工具;③优化神经网络架构以提高模型训练效率和预测精度。 其他说明:论文不仅提出了理论框架,还提供了完整的代码实现,方便读者复现实验结果。此外,论文还讨论了未来的研究方向,包括扩展到更高频段(如300GHz)的数据处理、引入强化学习优化超参数、以及实现多物理场耦合的智能电磁暴露评估系统。建议读者在实际应用中根据具体需求调整模型架构和参数,并结合真实数据进行验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值