10864 - The Predator
Posted: Wed Jun 08, 2005 7:28 pm
Could anybody tell me what's wrong in my solution?
Thank you.
Code: Select all
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <cmath>
#include <vector>
#include <string>
using namespace std;
#define For(i,a,b) for(int i=(a); i<=(b); i++)
#define Rep(i,n) for(int i=0; i<(n); i++)
#define Repd(i,n) for(int i=(n)-1; i>=0; i--)
#define Size(x) (int(x.size()))
struct rect
{
int r1,c1,r2,c2;
void read()
{
int k;
scanf("%d%d%d",&r1,&c1,&k);
r2=r1+k-1;
c2=c1+k-1;
}
bool includes(int r,int c)
{
return r1<=r && r<=r2 && c1<=c && c<=c2;
}
int area()
{
return (r2-r1+1)*(c2-c1+1);
}
bool check()
{
return r1<=r2 && c1<=c2;
}
};
bool inters(rect a,rect b,rect &c)
{
c.r1=max(a.r1,b.r1);
c.r2=min(a.r2,b.r2);
c.c1=max(a.c1,b.c1);
c.c2=min(a.c2,b.c2);
return c.check();
}
vector<rect> rr;
int sum;
void rec(int k,int sg,rect cur)
{
assert(cur.check());
if(k<0) sum+=sg*cur.area();
else
{
rec(k-1,sg,cur);
rect r;
if(inters(cur,rr[k],r)) rec(k-1,-sg,r);
}
}
int solve(vector<rect> rs,int r,int c)
{
rect big;
big.r1=big.c1=1;
big.r2=big.c2=10000;
Repd(i,Size(rs)) if(rs[i].includes(r,c))
assert(inters(big,rs[i],big));
rr.clear();
Repd(i,Size(rs)) if(!rs[i].includes(r,c))
{
rect r;
if(inters(big,rs[i],r)) rr.push_back(r);
}
sum=0;
rec(Size(rr)-1,1,big);
return sum;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt","rt",stdin);
freopen("output.txt","wt",stdout);
#endif
int c,test;
test=0;
while(scanf("%d",&c)==1)
{
vector<rect> rs;
For(i,1,c)
{
rect r;
r.read();
if(r.check()) rs.push_back(r);
}
scanf("%d",&c);
printf("Case %d:\n",++test);
For(i,1,c)
{
int r,c;
scanf("%d%d",&r,&c);
printf("%d\n",solve(rs,r,c));
}
}
exit(0);
return 0;
}