题意:给你一个n列m行的方格,p次折叠,a==1,向右折b个格子;a==2,向上折b个格子;t次询问,问折叠好后新形成的方格(xi,yi)处有几层?
思路:处理好边界,模拟一下。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define pre(i,x,n) for(int i=x;i<=n;i++)
#define ll long long int
ll h[10010],l[10010];
int main()
{
int n,m,p,t;
while(~scanf("%d%d%d%d",&n,&m,&p,&t)&&n)
{
memset(l,0,sizeof(l));
memset(h,0,sizeof(h));
pre(i,0,n-1){l[i]=1;}
pre(i,0,m-1){h[i]=1;}
int x=0,y=0;
pre(i,1,p)
{
int a,b;
scanf("%d%d",&a,&b);
if(a==1)
{
pre(i,0,b-1)
l[x+b*2-1-i]+=l[x+i];
x+=b;
}
else
{
pre(i,0,b-1)
h[y+b*2-1-i]+=h[y+i];
y+=b;
}
}
while(t--){
int a,b;
scanf("%d%d",&a,&b);
printf("%lld\n",l[x+a]*h[y+b]);
}
}
return 0;
}