《Codeforces Round #645 (Div. 2)》
C:
思路:
观察表可以发下,路径权值和最小的走法为一直向右然后一直向下。
最大的走法为一直向下然后一直向右。(因为权值是斜向下递增)
从下面图片可见,当我们将向右走的操作改成向下走,就可以让总的权值增加1.且发现最大值和最小值之间的数都能得到.
那么显然ans = max-min+1.
如果直接暴力去求max和min显然不行。
观察可以发现为(x1-x2)*(y1-y2)+1..
Code:
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> pii; const int N = 1e4+5; const int M = 1e6+5; const int Mod = 998244353; #define pi acos(-1) #define INF 1e27 #define INM INT_MIN #define pb(a) push_back(a) #define mk(a,b) make_pair(a,b) #define dbg(x) cout << "now this num is " << x << endl; #define met0(axx) memset(axx,0,sizeof(axx)); #define metf(axx) memset(axx,-1,sizeof(axx)); #define sd(ax) scanf("%d",&ax) #define sld(ax) scanf("%lld",&ax) #define sldd(ax,bx) scanf("%lld %lld",&ax,&bx) #define sdd(ax,bx) scanf("%d %d",&ax,&bx) #define sddd(ax,bx,cx) scanf("%d %d %d",&ax,&bx,&cx) #define sfd(ax) scanf("%lf",&ax) #define sfdd(ax,bx) scanf("%lf %lf",&ax,&bx) #define pr(a) printf("%d\n",a) #define plr(a) printf("%lld\n",a) void slove() { int t;sd(t); while(t--) { int x1,x2,y1,y2; sdd(x1,y1);sdd(x2,y2); LL d1 = abs(x1-x2),d2 = abs(y1-y2); plr(d1*d2+1); } } int main() { slove(); // system("pause"); return 0; }