T1:折纸
题目大意:
\(Onise\)喜欢画画. 他有一张 \(width * height\)的纸.他在纸上的操作步骤如下:
-
从直线 \(x = xfold\) 对折(是把左边的纸折到右边上面);
-
把纸竖直对折成\(cnt+1\)等份,就是把最上面的折到下面,共操作\(cnt\)次;
-
现在\(Onise\),画一个实心矩行,左下角的坐标是\((x1, y1)\),右上角坐标是 \((x2, y2)\)。注意: \((x1, y1)\) 、\((x2, y2)\)是把纸折完之后的坐标,\((0, 0)\)是左下角坐标, \(Onise\)画的那些格子的墨水都会渗到它对应的下层的那些格子;
-
再次展开纸。
给你纸的\(width\)和\(height\)、\(xfold\)、\(cnt\)、\(x1\)、\(y1\)、\(x2\)、\(y2\),请问画完之后,还有多少个格子是没有被渗到颜色的。
正解:数学
如图\(5\)是折后的图形。
白色部分是沾墨水的部分。
由题可知白色部分必定是一个矩形。
所以我们可以先求出墨水沾到的大小。
再用整个纸的大小减去沾墨水的大小就是答案
考虑竖折,必定是\(cnt+1\)块叠在一起,所以竖折对答案的贡献是\((cnt+1)*白色部分的块数\)
考虑横折,
所以,只用考虑范围内的白块,贡献就是\(2*(cnt+1)*范围内的白块个数\)
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
ll w,h,xf,cnt,x1,x2,y1,y2;
scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&w,&h,&xf,&cnt,&x1,&y1,&x2,&y2);
xf=min(xf,w-xf);
ll res=(x2-x1)*(y2-y1)*(cnt+1);
if (x2>=xf)
{
if (x1<xf)
res+=(xf-x1)*(y2-y1)*(cnt+1);
}
else res=res*2;
ll ans=w*h-res;
printf("%lld\n",ans);
}
}
·····