CF 241C Mirror Box (二)

2014-11-24 09:23:24 · 作者: · 浏览: 1
}
des=1-des;
pos+=l;
}
ans=max(ans,test);
}
printf("%d\n",ans);
}
return 0;
}

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 1<<30
#define M 200005
#define N 200005
#define maxn 300005
#define eps 1e-10
#define zero(a) fabs(a) #define Min(a,b) ((a)<(b) (a):(b))
#define Max(a,b) ((a)>(b) (a):(b))
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define mem(a,b) memset(a,b,sizeof(a))
#define LL long long
#define lson step<<1
#define rson step<<1|1
#define MOD 1000000009
#define sqr(a) ((a)*(a))
#define Key_value ch[ch[root][1]][0]
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
int t[100005],f[100005];
int L=100000;
double H=100.0;
bool flag[105];
int main()
{
int hl,hr,n,val[105];
while(scanf("%d%d%d",&hl,&hr,&n)!=EOF)
{
mem(t,0);mem(f,0);
for(int i=1;i<=n;i++)
{
int l,r;char str[10];
scanf("%d%s%d%d",&val[i],str,&l,&r);
if(str[0]=='F') for(int j=l;j<=r;j++) f[j]=i;
else for(int j=l;j<=r;j++) t[j]=i;
}
int ans=0;
for(int i=1;i<=n;i++)
{
double tmp=0;
if(i&1) tmp+=hl/H+(i-1)+hr/H;

else tmp+=hl/H+(i-1)+(H-hr)/H;
double l=L/tmp;
double pos=l*hl/H;
int des=1;
int test=0;
mem(flag,false);
for(int j=1;j<=i;j++)
{
if(des)
{
if(f[(int)floor(pos)]==0&&f[(int)ceil(pos)]==0){test=-1;break;}
int id=f[(int)floor(pos)];
if(flag[id]) {test=-1;break;}
flag[id]=true;test+=val[id];
}
else
{
if(t[(int)floor(pos)]==0&&t[(int)ceil(pos)]==0){test=-1;break;}
int id=t[(int)floor(pos)];
if(flag[id]) {test=-1;break;}
flag[id]=true;test+=val[id];
}
pos+=l;
des=1-des;
}
ans=max(ans,test);
tmp=0;
if(i&1) tmp+=(H-hl)/H+(i-1)+(H-hr)/H;
else tmp+=(H-hl)/H+(i-1)+hr/H;
l=L/tmp;
pos=l*(H-hl)/H;des=0;
test=0;
mem(flag,false);
for(int j=1;j<=i;j++)
{
if(des)
{
if(f[(int)floor(pos)]==0&&f[(int)ceil(pos)]==0){test=-1;break;}
int id=f[(int)floor(pos)];
if(flag[id]) {test=-1;break;}
flag[id]=true;test+=val[id];
}
else
{
if(t[(int)floor(pos)]==0&&t[(int)ceil(pos)]==0){test=-1;break;}
int id=t[(int)floor(pos)];
if(flag[id]) {test=-1;break;}
flag[id]=true;test+=val[id];
}
des=1-des;
pos+=l;
}
ans=max(ans,test);
}
printf("%d\n",ans);
}
return 0;
}