jzoj P1509【普及模拟】单元格

题目大意:
在一个R行C列的表格要选出3个不同的单元格A,B,C。定义这种选择的“费用”= f[A][B] + f[B][C] + f[C][A],f[X][Y]是指X到Y的距离,即X,Y所在行编号的差的绝对值 + X,Y所在列编号的差的绝对值。求出在min~max费用范围内有多少个这种选择。

题解:
ans:=6* (r-2) * (c-2) * (r-i+1) * (c-j+1);
1.因为其实单元格可以看做一个个点,而单元格A,B,C三个点可以构成一个三角形,这个三角形所处位置是一个矩形,而推理可知矩形的周长就是它的费用,如果他的费用在min~max之间就进行下一步。
2.对于一个矩形,题目要求都不在点同一行同一列所以矩形的构成这时有2种情况:
(1)一个点在端点上,2个点分别在这个点在矩形中所不相邻的2条边上,这时候有1 * (r-2)* (c-2)中情况。
以上因为矩形端点有4个,所以情况要* 4,为4 * (r-2) * (c-2)。
(2)2个点在端点上,这时候因为题意不能有2点在同一列或同一行,所这2个点矩形的对角线,而这个时候矩形的4条边都不能出现第3个点,这时候点在这条对角线构成的矩形中,有(r-2) * (c-2)的情况。
以上因为矩形有2条对角线,所以情况要 * 2,为2 * (r-2) * (c-2)
2种情况相加得来构成这种矩形的3个点方案情况有6*(r-2) * (c-2)种,然后求出在表格中这种矩形的数量(r-i+1) * (c-j+1)相乘,累加,取模就是答案。
时间复杂度:O(n^2)

var
  x,y,i,j:longint;
  r,c,ans:int64;
begin
  assign(input,'table.in');reset(input);
  assign(output,'table.out'); rewrite(output);
   readln(r,c,x,y);
   for i:=3 to r do
       begin
          for j:=3 to c do
              if (i+j-2)*2>=x then
                  if (i+j-2)*2<=y
                     then ans:=ans+6*(i-2)*(j-2)*(r-i+1)*(c-j+1);
          ans:=ans mod 1000000007;
       end;
  writeln(ans);
  close(input); close(output);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值