UVA 11538 Chess Queen
- 链接:UVA 11538
- 题意:给出n*m的矩阵,在里面放两个非等价国际象棋皇后,问两皇后相互攻击的情况有多少?
- 思路:个人比较智障,刚开始觉得水题,暴力能过,于是有如下代码,很明显T了
for(ll i=0;i<n;i++)
for(ll j=0;j<m;j++)
sum+=min(i,j)+min(n-i-1,m-j-1)+min(n-i-1,j)+min(i,m-j-1);
sum+=((n-1)+(m-1))*m*n;
然后就换了种做法,由于是矩形,遍历对角线,对角线长度i乘以(i-1)就是这个对角线上对sum的贡献,由于对称性,只算左上到右下角,主对角线(或者是最长的对角线放最后算),得到的结果乘以2。这时再加上主对角线对sum的贡献,一共有max(m,n)-min(m,n)个。加完之后再将sum乘以2。over。。。
下面是完整代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <algorithm>
#include <map>
#include <bitset>
#include <vector>
#include <queue>
#include <stack>
#include <utility>
#include <functional>
#include <sstream>
#include <list>
#include <complex>
#include <ctime>
using namespace std;
#define ll long long
#define ull unsigned long long
const int MAXN=100005;
const int INF=987654323;
const int MOD=1e9+7;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ull n,m;
ull sum;
cin>>n>>m;
while(n||m){
sum=0;
ll M=min(m,n);
for(ll i=1;i<M;i++)
sum+=i*(i-1);
sum*=2;
sum+=(max(n,m)-min(m,n)+1)*M*(M-1);
sum*=2;
sum+=((n-1)+(m-1))*m*n;
cout<<sum<<endl;
cin>>n>>m;
}
return 0;
}