题目描述
通过找规律
(1)奇数位为负,偶数位为正
(2)奇数位加偶数位为1,偶数位加奇数位为1
或找前缀和的规律
时间复杂度
O(n)
C++ 代码
自己做的,没有想到前缀和,只考虑到奇数位和偶数位相加为1
#include<iostream>
using namespace std;
int n;
int main()
{
scanf("%d",&n);
while(n--)
{
int l,r;
scanf("%d%d",&l,&r);
int len=abs(r)-abs(l)+1;
if (len%2==0 && l%2!=0)
printf("%d\n",len/2);
if (len%2==0 && l%2==0)
printf("%d\n",len/2*(-1));
if (len%2!=0 && l%2!=0)
printf("%d\n",(len-1)/2+(-1)*r);
if (len%2!=0 && l%2==0)
printf("%d\n",(len-1)/2*(-1)+r);
}
return 0;
}
C++ 代码
参考大神做法
#include<iostream>
using namespace std;
int main()
{
/*
思路:因为原序列是:-1,2,-3,4,-5,6,...
所以其前缀和序列是:-1, 1,-2, 2,-3, 3,...
故求区间和就简单了。
sum=s[r]-s[l-1];
*/
int n;
cin>>n;
while(n--)
{
int l,r;
cin>>l>>r;
if(l & 1) l=l/2;//l为奇数,算的是s[l-1]偶数位和
else l=-l/2;//l是偶数,算的是s[l-1]奇数位和(多了一个负号)
if(r & 1) r=-(r+1)/2;//r是奇数,计算s[r](上取整同时有负号)
else r=r/2;//r是偶数,计算s[r]
cout<<r-l<<endl;//s[r]-s[l-1]
}
return 0;
}