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)
题海 | 题目 | 知识点 |
---|---|---|
A | Cherry | |
B | Cobb | |
C | Mikasa | |
D | Diane | |
E | You |
以上是关于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)