1012: QAQ的区间统计
时间限制: 1 Sec 内存限制: 128 MB提交: 155 解决: 50
[ 提交][ 状态][ 讨论版]
题目描述
QAQ有一个区间[L, R]。已知QAQ很喜欢长度为奇数的区间,现在请你告诉他有多少个长度为奇数的子区间。
对于区间[2 4]来讲,它的子区间有[2 2] [2 3] [2 4] [3 3] [3 4] [4 4]共6个。
为了简化题目,QAQ所给的区间里面全是非负整数。
对于区间[2 4]来讲,它的子区间有[2 2] [2 3] [2 4] [3 3] [3 4] [4 4]共6个。
为了简化题目,QAQ所给的区间里面全是非负整数。
输入
第一行输入一个整数T,代表有T组测试数据。
每组数据输入两个整数L,R,代表区间的端点。
注:1 <= T <= 1000000,0 <= L <= R <= 100000000。
每组数据输入两个整数L,R,代表区间的端点。
注:1 <= T <= 1000000,0 <= L <= R <= 100000000。
输出
对每组测试数据,输出一个整数代表长度为奇数的子区间个数。
样例输入
2
1 6
1 5
样例输出
12
注意:L和R都可能等于10^8,当程序中出现两数相乘或者相加的结果超int的时候,L和R就不能用int存,要用long long;一定要注意这个问题,否则会出错;
代码:
#include<stdio.h> int main() { int t; long long l,r; scanf("%d",&t); while(t--) { long long sum=0; scanf("%lld%lld",&l,&r); long long t=r-l+1; if(t%2==0) { int m=t/2; sum=m*(2+t)/2; } else { int m=t/2+1; sum=(1+t)*m/2; } printf("%lld\n",sum); } return 0; }
代码2:因为没用long long,WA到死;
#include<stdio.h> int main() { int t; long long L,R,n; scanf("%d",&t); while(t--) { long long ans=0; scanf("%lld%lld",&L,&R); if((R-L+1)%2==0) { n=(R-L+1)/2; } else { n=(R-L+1)/2+1; } ans=n*(R-L+1)-n*(n-1); printf("%lld\n",ans); } return 0; }