题目:http://codeforces.com/contest/556/problem/E
题意:一块只有左上角的巧克力,每次从对角线位置向左或者向上吃,并且只能连续地吃。有q吃查询,问每次能吃的长度。
分析:由于x+y=n+1,对于一次向上吃,它能吃的长度能由上方吃过的离它最近的那一次得到。向坐吃同理。分情况讨论就行了。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const LL INF = 1E9+9;
struct node
{
int s,t,dir; //1代表上,0代表左
node(int a=0,int b=0,int c=0):
s(a),t(b),dir(c){}
bool operator < (const node &t)const
{
return s<t.s;
}
};
set <node> st;
set <int> visit;
int main()
{
typedef set <node>::iterator its;
int n,q,x,y;
char op[2];
scanf("%d%d",&n,&q);
st.insert(node(0,1,1));
st.insert(node(n+1,1,0));
while(q--)
{
scanf("%d%d%s",&x,&y,op);
if(visit.find(x)!=visit.end())
{
puts("0");
continue ;
}
visit.insert(x);
if(op[0]=='U')
{
its it=st.upper_bound(node(x));
if(it->dir==1)
{
printf("%d\n",it->t-x+1);
st.insert(node(x,it->t,1));
}
else
{
printf("%d\n",it->s-x);
st.insert(node(x,it->s-1,1));
}
// printf("info : %d %d %d\n",it->s,it->t,it->dir);
}
else
{
its it=--st.upper_bound(node(x));
if(it->dir==1)
{
printf("%d\n",x-it->s);
st.insert(node(x,it->s+1,0));
}
else
{
printf("%d\n",x-it->t+1);
st.insert(node(x,it->t,0));
}
// printf("info : %d %d %d\n",it->s,it->t,it->dir);
}
}
return 0;
}