原题链接https://codeforces.com/problemset/problem/1371/B
当时没做出来www,首先英语不过关,读题读了好长时间,关键是我就干想了,对于我这种菜鸡来说,这种题光靠想是不行的,必须大量枚举简单的测试用例,找到规律然后就可以秒杀掉。
简单说一下题意:就是找到满足以下条件的图形的数量:
- all of the painted cells to be connected by side:任意方格必须有一条边与其他方格相邻。
- On this calendar, dates are written from the left cell to the right cell in a week. If a date reaches the last day of a week, the next day’s cell is the leftmost cell in the next (under) row.意思是就和我们用的日历一样,先从左到右排(起点可以是任意位置)达到最右端后便从下一行的最左端开始。
- Two shapes are the same if there exists a way to make them exactly overlapped using only parallel moves, parallel to the calendar’s sides.意思是通过平移可以重合的图形等效为一种
下面详细说这道题怎么找规律
1.先找案例的规律
input
5
3 4
3 2
3 1
13 7
1010000 9999999
output
4
3
1
28
510049495001
通过这一族测试用例,我们首先发现随着r的增大,一开始ans是增大的,但在临界点之后ans不在变化,本例中的临界点是3,r>=3的结果是一样的
之后我们可以推断出在临界点之后的结果是取决于n的
可是具体的规律是什么呢?
别急,我们再找一组规律
这次我们明显可以看出,有等差数列求和的意思,当r大于临界点后,ans=n*(n-1)/2+1;
而在临界点之前,ans=(1+r)*r/2;
于是代码出来了:
#include <iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
long long n,r;
cin>>n>>r;
cout<<min(n*(n-1)/2+1,(1+r)*r/2)<<endl;
}
return 0;
}