Codeforces Round 871 (Div. 4) G. Hits Different (二维前缀和/思维)

题目连接:1829g
题目意思是:找出某个数字及其上方的相关点的值的平方和

赛时没想到这个斜过来的操作导致没看出来数字的分布情况,进而没看出来是个二维前缀和


题目给的图没看出来结论,导致推了几个fake出来
后面看了题解才明白:原来斜过来能发现数字的分布规律,进而可以用二维前缀和来求解
首先把每个方块斜过来然后把整张图斜过来

发现数字的规律是:成斜线自左下向右上填充
因此可以枚举y=x+c的c,将其填入

code:


const int N =1505;
/*
//关于为什么要把边长设置为1500
因为我们看到题目写道,n的最大值为1e6
而这个数组中有效的范围其实只有那个三角形(S=n*n*1/2)
因此凑一个数满足n*n*1/2>=1e6即可
此时不难想起15*15=225,故选择n=1500
*/
long long g[N][N];
long long ans[5000005];

long long c=1;//为何用long long? 这个c后续就是题目中给的n(n<1e6),因此要开long long防止出现1e6*1e6爆int的情况

inline void solve(){
	for(int i=1;i<=N;i++){
		for(int j=i,k=1;j>0;j--,k++){
			g[j][k]=g[j-1][k]+g[j][k-1]-g[j-1][k-1]+c*c;
			ans[c++]=g[j][k];
		}
	}
}

int main(){
	cin_unlocked();
	int t;cin>>t;
	solve();
	for(;t--;){
		int x;cin>>x;
		cout<<ans[x]<<endl;
	}
	return 0;
}

posted @   ~Chitoge  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示