HDU

来源:互联网 发布:友盟推送 php服务器端 编辑:程序博客网 时间:2024/06/05 17:04

第一次做区间合并,对于这种保存区间的还是很不熟悉,向上更新的时候还是没有头绪。

区间合并的题目还是需要多写。

对于本题而言,就是求一个包含查询节点的连续区间的长度。

pushup的时候 需要注意的是,向上更新的时候,一个区间全是没被破坏的情况。

#include <bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;int n , m;int q;const int maxn = 50000+10;stack<int>st;struct SegTree{    int lx,rx,mx,l,r;}t[maxn << 2];void build(int l,int r,int i){    t[i].l = l;t[i].r = r;t[i].lx = t[i].rx = t[i].mx = r-l+1;//    cout << "WWWW: " << t[i].mx << endl;    if(l == r) return;    int mid = (l + r) >> 1;    build(l,mid,i<<1);    build(mid+1,r,i<<1|1);}void pushup(int i){    t[i].lx = t[i<<1].lx;    t[i].rx = t[i<<1|1].rx;    t[i].mx = max(t[i<<1].mx , t[i<<1|1].mx);    t[i].mx = max(t[i].mx , t[i<<1].rx + t[i<<1|1].lx);    if(t[i<<1].lx == t[i<<1].r - t[i<<1].l + 1)        t[i].lx +=  t[i<<1|1].lx;    if(t[i<<1|1].rx == t[i<<1|1].r - t[i<<1|1].l + 1 )        t[i].rx +=  t[i<<1].rx;//    cout << "AAAAA:  " << t[i].mx << endl;}void update(int t1, int i, int val){    if(t[i].l == t[i].r)    {        if(val == 1)        {            t[i].lx = t[i].rx = t[i].mx = 1;        }        else        {            t[i].lx = t[i].rx = t[i].mx = 0;        }//        cout << t[i].l << "*****" << t[i].lx << endl;        return ;    }    int mid = (t[i].l + t[i].r) / 2;    if(t1 <= mid) update(t1,i<<1,val);    if(t1 >  mid) update(t1,i<<1|1,val);    pushup(i);}int query(int t1, int i){//    if(t[i].l==3 && t[i].r == 4) cout << " YES " << t[i].mx << endl;    if(t[i].l == t[i].r || t[i].mx == 0 || t[i].mx == t[i].r - t[i].l + 1)    {        return t[i].mx;    }    int mid = (t[i].l + t[i].r) >> 1;//    cout << "LR: " << t[i].l  << " " << t[i].r << endl;    if(t1 <= mid)    {        if(t1 >= t[i<<1].r - t[i<<1].rx + 1)        {//            cout << "A" <<endl;            return  query(t1,i<<1) +query(mid+1,i<<1|1);        }        else        {//            cout << "B" <<endl;            return query(t1,i<<1);        }    }    else    {//        cout << "T1 : " << t1 << "  " << t[i<<1|1].lx + t[i<<1|1].l - 1 << endl;        if(t1 <= t[i<<1|1].lx + t[i<<1|1].l - 1)        {//            cout << "C" <<endl;            return query(t1,i<<1|1) + query(mid , i<<1);        }        else        {//            cout << "D" <<endl;//            cout << " %%%%%% " << t[i<<1|1].l << " " << t[i<<1|1].r << " " << t1 << endl;            return query(t1,i<<1|1);        }    }}int main(){    char ch;    int k;    while(cin >> n >> m)    {        while(!st.empty())        {            st.pop();        }        build(1,n,1);        for(int i = 0 ; i < m ; i++)        {            cin >> ch;            if(ch == 'D')            {                cin >> k;                st.push(k);//                cout << "k :" << "|" << k << "|" << endl;//                cout << st.top() << endl;                update(k,1,0);            }            else if(ch == 'R')            {                if(st.empty()) continue;                int p = st.top();st.pop();//                cout << "R :" << "|" << p << "|" << endl;                update(p,1,1);            }            else            {                cin >> k;                cout << query(k,1) << endl;            }        }    }    return 0;}


原创粉丝点击