分析:如果做过 poj的3667题会发现这题不难的,只不过是复杂了一点罢了,不过从昨晚下午5点多开始做,到晚上11.40才调处来找到bug,因为实在是找不出来错误最后重新复制的输出,发现就然对了,仔细研究下发现原来是从文章里面复制出来的句子包含中文的标点,标点啊,非常难发现的的东西,尤其是使用cb编译器,几乎没有看出来有什么区别......也是涨了一次教训吧,以后代码的输出要在给的标准输出里面复制,不要再文章里面复制。
#include<algorithm>
#include<stdio.h>
#include<stack>
#include<string.h>
using namespace std;
#define lson r<<1
#define rson r<<1|1
const int maxn = 1e5+5;
struct segmentTree
{///bool操作分别代表 女神屌丝,学习
int L, R, lsum[2], rsum[2], sum[2];///0是屌丝,1是女神
bool ns, ds, study;
int mid(){return (L+R)>>1;}
int len(){return R-L+1;}
void clearPlan(int fstudy)
{///准备学习,清空所有计划
if(fstudy == true)
{
lsum[0] = lsum[1] = len();
rsum[0] = rsum[1] = len();
sum[0] = sum[1] = len();
study = true; ds = ns = false;
}
}
void Plmm(int fns)
{///女生占用时间,屌丝无法占用
if(fns == true)
{
lsum[0] = lsum[1] = 0;
rsum[0] = rsum[1] = 0;
sum[0] = sum[1] = 0;
ns = true, ds = false;
}
}
void DiaoSi(int fds)
{///屌丝一起打游戏占用时间,可被女神再次占过来
if(fds == true)
{
lsum[0] = rsum[0] = sum[0] = 0;
ds = true;
}
}
}a[maxn<<2];
void Build(int r, int L, int R)
{
a[r].L = L, a[r].R = R;
a[r].clearPlan(1);
a[r].study = a[r].ds = a[r].ns = false;
if(L == R)return ;
Build(lson, L, a[r].mid());
Build(rson, a[r].mid()+1, R);
}
void pushDown(int r)
{
if( a[r].study )
{
a[lson].clearPlan(true);
a[rson].clearPlan(true);
a[r].study = false;
}
if( a[r].ns )
{
a[lson].Plmm(true);
a[rson].Plmm(true);
a[r].ns = a[r].ds = false;
}
if( a[r].ds )
{
a[lson].DiaoSi(true);
a[rson].DiaoSi(true);
a[r].ds = false;
}
}
void pushUp(int r, int k)
{///k等于 0 更新屌丝区间, 等于1更新女神区间
a[r].lsum[k] = a[lson].lsum[k], a[r].rsum[k] = a[rson].rsum[k];
if( a[lson].lsum[k] == a[lson].len() )
a[r].lsum[k] += a[rson].lsum[k];
if( a[rson].rsum[k] == a[rson].len() )
a[r].rsum[k] += a[lson].rsum[k];
a[r].sum[k] = max( a[lson].sum[k], max( a[rson].sum[k], a[lson].rsum[k] + a[rson].lsum[k] ) );
}
///op等于1时学习,2女神,3屌丝
void upDate(int r, int L, int R, int op)
{
if( a[r].L == L && a[r].R == R )
{
if(op == 1) a[r].clearPlan(true);
if(op == 2) a[r].Plmm(true);
if(op == 3) a[r].DiaoSi(true);
return ;
}
pushDown(r);
if(R <= a[r].mid())
upDate(lson, L, R, op);
else if(L > a[r].mid())
upDate(rson, L, R, op);
else
{
upDate(lson, L, a[r].mid(), op);
upDate(rson, a[r].mid()+1, R, op);
}
pushUp(r, 0);
pushUp(r, 1);
}
///查找女神或者屌丝是否有k时间,k等于0屌丝,1女神,有的话返回下标没有返回0
int Query(int r, int t, int k)
{
pushDown(r);
if( a[r].sum[k] < t )return 0;
if( a[r].lsum[k] >= t)return a[r].L;
if( a[lson].sum[k] >= t ) return Query(lson, t, k);
if( a[lson].rsum[k] + a[rson].lsum[k] >= t )
return a[lson].R - a[lson].rsum[k] + 1;
return Query(rson, t, k);
}
int main()
{
int T, t=1;
scanf("%d", &T);
while(T--)
{
int N, M, x, y; char s[20];
scanf("%d%d", &N, &M);
Build(1, 1, N);
printf("Case %d:\n", t++);
while(M--)
{
scanf("%s%d", s, &x);
if(s[0] == ‘S‘)
{
scanf("%d", &y);
upDate(1, x, y, 1);
printf("I am the hope of chinese chengxuyuan!!\n");
}
else if(s[0] == ‘N‘)
{
y = Query(1, x, 0);
if(!y) y = Query(1, x, 1);
if(y)
{
upDate(1, y, y+x-1, 2);
printf("%d,don‘t put my gezi\n", y);
}
else
printf("wait for me\n");
}
else
{
y = Query(1, x, 0);
if(y)
{
upDate(1, y, y+x-1, 3);
printf("%d,let‘s fly\n", y);
}
else
printf("fly with yourself\n");
}
}
}
return 0;
}