题目描述
传送门
题意:
1右下2右3右上4下5回到原点6上7左下8左9左上
起点在原点,按照操作进行,走出来一个多边形,求多边形的面积。
题解
这题好毒啊…
比较卡内存,1500+的MLE看起来很多人都不看题…
然后就是貌似double会炸精度,从走法上看最后的面积只有可能是整数或者0.5的小数,于是用longlong然后最后特判一下就行了
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 1000005
#define LL long long
struct Vector
{
LL x,y;
Vector(LL X=0,LL Y=0)
{
x=X,y=Y;
}
};
typedef Vector Point;
Vector operator - (Vector A,Vector B) {return Vector(A.x+B.x,A.y+B.y);}
LL mx[10]={0,1,1,1,0,0,0,-1,-1,-1};
LL my[10]={0,-1,0,1,-1,0,1,-1,0,1};
int T,n;
LL x,y,area;
Point P,A,B;
char ch;
LL Abs(LL x)
{
return (x>0)?x:-x;
}
LL Cross(Vector A,Vector B)
{
return A.x*B.y-A.y*B.x;
}
int main()
{
scanf("%d\n",&T);
while (T--)
{
x=y=0;P=Point(0,0);area=0;
ch=getchar();
if (ch=='5') {ch=getchar();puts("0");continue;}
x+=mx[ch-'0'],y+=my[ch-'0'];
A=Point(x,y);
ch=getchar();
while (ch!='5')
{
x+=mx[ch-'0'],y+=my[ch-'0'];
B=Point(x,y);
area+=Cross(A-P,B-P);
A=B;
ch=getchar();
}ch=getchar();
area=Abs(area);
printf("%lld",area/2);
if (area&1) puts(".5");
else puts("");
}
}