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

Posted Chitoge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
	// debug
	// for(int i=0;i<6;i++)
	// 	for(int j=0;j<6;j++)
	// 		cout<<g[i][j]<<\',\';
	// 	cout<<endl;
	// 
	for(;t--;)
		int x;cin>>x;
		cout<<ans[x]<<endl;
	
	return 0;


Codeforces Round #735 (Div. 2)

Codeforces Round #735 (Div. 2)

题海题目知识点
ACherry
BCobb
CMikasa
DDiane
EYou

以上是关于Codeforces Round 871 (Div. 4) G. Hits Different (二维前缀和/思维)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #774 (Div. 2)

Codeforces Round #808 (Div. 1)(A~C)

Codeforces Round #717 (Div. 2)

Codeforces Round #784 (Div. 4)

Codeforces Round #340 (Div. 2) B

Codeforces Round #716 (Div. 2)