1009: QAQ的区间价值 [思维]
时间限制: 1 Sec 内存限制: 128 MB提交: 110 解决: 67 统计
题目描述
QAQ有一个整数序列,元素个数有
N
N个,分别为
1,2,3...N−1,N
1,2,3...N−1,N。
假定用数组 a[] a[]来依次记录 N N个元素,那么区间 [i,j] [i,j]的价值 =sum(i,j)∗Check(i,j) =sum(i,j)∗Check(i,j)。
其中 sum(i,j)=∑jk=ia[k] sum(i,j)=∑k=ija[k],表示区间 [i,j] [i,j]元素之和。
假定用数组 a[] a[]来依次记录 N N个元素,那么区间 [i,j] [i,j]的价值 =sum(i,j)∗Check(i,j) =sum(i,j)∗Check(i,j)。
其中 sum(i,j)=∑jk=ia[k] sum(i,j)=∑k=ija[k],表示区间 [i,j] [i,j]元素之和。
Check(i,j)=(j−i+1) Check(i,j)=(j−i+1) & 1?1:−1 1?1:−1,表示区间长度为奇数返回 1 1,反之返回 −1 −1。
现在,QAQ想知道所有子区间的价值之和。
对于区间 [2,4] [2,4]而言,子区间有 6 6个 [2,2],[2,3],[2,4],[3,3],[3,4],[4,4] [2,2],[2,3],[2,4],[3,3],[3,4],[4,4]。
输入
第一行输入一个整数
T
T,代表有
T
T组测试数据。
每组数据占两行,第一行输入一个整数 N N,代表序列的元素个数。
注: 1<=T<=10000,1<=N<=100000 1<=T<=10000,1<=N<=100000。
每组数据占两行,第一行输入一个整数 N N,代表序列的元素个数。
注: 1<=T<=10000,1<=N<=100000 1<=T<=10000,1<=N<=100000。
输出
对每组测试数据,输出序列所有子区间价值之和。
样例输入
3
1
2
99
样例输出
1
0
2500
找规律的题。。。。
AC代码:
/*
若为偶数,则结果为0
若为奇数,则结果为上一个奇数时的结果加上这个奇数
*/
#include<cstdio>
typedef long long LL;
LL a[100005];
int main()
{
LL T,N;
a[1]=1l;
for(LL i=2;i<=100005;i++)
{
if(i&1)
a[i]=a[i-2]+i;
else
a[i]=0;
}
while(~scanf("%lld",&T))
{
while(T--)
{
scanf("%lld",&N);
printf("%lld\n",a[N]);
}
}
return 0;
}
本文介绍了一道算法题,需要计算整数序列中所有子区间的区间价值之和。区间价值由区间元素之和与区间长度的奇偶性决定。提供了一种规律性的解题思路及AC代码。
2710

被折叠的 条评论
为什么被折叠?



