SRM 422 Div1 Med BedroomFloor

やるだけ
こんな問題二度と解きたくない

typedef long long ll;
class BedroomFloor
{
	public:
	ll num[6]={0};
	long long numberOfSticks(int x1, int y1, int x2, int y2)
	{
		ll ans=0ll;
		int lx=(x1/5+((x1%5!=0)?1:0))*5;
		int rx=(x2/5)*5;
		int uy=(y1/5+((y1%5!=0)?1:0))*5;
		int dy=(y2/5)*5;
		ans+=((ll)(rx-lx))*(dy-uy)/5;
		ll k = (dy-uy)/10;
		num[lx-x1]+=5*k;
		num[5]+=(lx-x1)*k;
		if((lx/5+uy/5)%2==0&&(dy-uy)%10!=0)num[5]+=(lx-x1);
		else if((lx/5+uy/5)%2==1&&(dy-uy)%10!=0)num[lx-x1]+=5;
		num[x2-rx]+=5*k;
		num[5]+=(x2-rx)*k;
		if((rx/5+uy/5)%2==0&&(dy-uy)%10!=0)num[x2-rx]+=5;
		if((rx/5+uy/5)%2==1&&(dy-uy)%10!=0)num[5]+=(x2-rx);
		k = (rx-lx)/10;
		num[5]+=(uy-y1)*k;
		num[uy-y1]+=5*k;
		if((lx/5+uy/5)%2==0&&(rx-lx)%10!=0)num[uy-y1]+=5;
		else if((lx/5+uy/5)%2==1&&(rx-lx)%10!=0)num[5]+=uy-y1;
		num[5]+=(y2-dy)*k;
		num[y2-dy]+=5*k;
		if((lx/5+dy/5)%2==0&&(rx-lx)%10!=0)num[y2-dy]+=5;
		else if((lx/5+dy/5)%2==1&&(rx-lx)%10!=0)num[5]+=y2-dy;
		if((lx/5+uy/5)%2==0)num[lx-x1]+=uy-y1;
		else num[uy-y1]+=lx-x1;
		if((lx/5+dy/5)%2==0)num[y2-dy]+=lx-x1;
		else num[lx-x1]+=y2-dy;
		if((rx/5+dy/5)%2==0)num[x2-rx]+=y2-dy;
		else num[y2-dy]+=x2-rx;
		if((rx/5+uy/5)%2==0)num[uy-y1]+=x2-rx;
		else num[x2-rx]+=uy-y1;
		ll rem2=0,rem1=0;
		ans+=num[5];
		ans+=num[4];rem1+=num[4];
		ans+=num[3];rem2+=num[3];
		if(num[2]<=rem2)rem2-=num[2];
		else
		{
			ans+=(num[2]-rem2+1)/2;
			rem1+=((num[2]-rem2+1)/2)*5-2*(num[2]-rem2);
			rem2=0;
		}
		rem1+=rem2*2;
		if(rem1<num[1])
		{
			ll t = num[1]-rem1;
			ans+=t/5;
			if(t%5!=0)ans++;
		}
		return ans;
	}
};