CodeForce 527C 非递归线段树 连续区间

#include
#include
using namespace std;
const int maxn=200010;
int lsum[maxn<<2][2];//从左开始连续0的个数
int rsum[maxn<<2][2];//从右开始连续0的个数
int sum[maxn<<2][2];//区间最大连续0
bool pure[maxn<<2][2];//区间是否全为零
int N[2];
void Pushup(int rt,int k) {
    pure[rt][k]=pure[rt<<1][k]&&pure[rt<<1|1][k];
    sum[rt][k]=max(rsum[rt<<1][k]+lsum[rt<<1|1][k],max(sum[rt<<1][k],sum[rt<<1|1][k]));//当前区间的最大连续=max(三部分)
    lsum[rt][k]=pure[rt<<1][k]?lsum[rt<<1][k]+lsum[rt<<1|1][k]:lsum[rt<<1][k];//左半区间全连续:当前区间llen = 右半区间llen(tlen) + 左半区间llen
    rsum[rt][k]=pure[rt<<1|1][k]?rsum[rt<<1|1][k]+rsum[rt<<1][k]:rsum[rt<<1|1][k];//右半区间全连续:当前区间rlen = 右半区间rlen(tlen) + 左半区间rlen
//向上推的过程可参考:https://blog.csdn.net/pengwill97/article/details/80113504
}
void BuildTree(int n,int k) {//建树,赋初值
    for(int i=0; i0; i--)
        Pushup(i,k);
    }
void Update(int L,int k) {//切割,更新
    int s=N[k]+L-1;
    pure[s][k]=lsum[s][k]=rsum[s][k]=sum[s][k]=0;
    for(s>>=1; s; s>>=1)
        Pushup(s,k);
}
int main(void) {
    //freopen("E:\\input.txt","r",stdin);
    int width,high,n,temp;
    while(cin>>width>>high>>n) {
            //找出非递归线段树的第一个数的位置
        N[0]=N[1]=1;
        while(N[0]>ch>>temp;
            ch=='H'?Update(temp,0):Update(temp,1);
            cout<<(long long)(sum[1][0]+1)*(sum[1][1]+1)<

 

你可能感兴趣的:(线段树)