zoukankan      html  css  js  c++  java
  • NOIP 模拟 $15; m ext{玫瑰花精}$

    题解 (by;zjvarphi)

    一道线段树题目

    这道题可以通过维护一棵线段树,线段树上的每个节点维护 ( m l,r,len,p) 分别表示这段区间最左边的花精,最右边的花精,被两只花精夹着的中间没有花精的最长一段距离,和取 ( m len) 是花精放的位置

    那么关键就是 ( m up) 操作,对于一个节点的 ( m l,r),若此区间只有一个花精,那么就设成 ( m l=r) 如果没有,那就都设为 (0)

    而后 ( m len) 可以由左儿子或右儿子最大值转移而来,特判相等情况,还可以由左儿子的 ( m r),和右儿子的 ( m l) 中间夹的一段转移而来

    Code
    #include<bits/stdc++.h>
    #define ri register signed
    #define p(i) ++i
    using namespace std;
    namespace IO{
        char buf[1<<21],*p1=buf,*p2=buf;
        #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
        template<typename T>inline void read(T &x) {
            ri f=1;x=0;register char ch=gc();
            while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
            while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
            x=f?x:-x;
        }
    }
    using IO::read;
    namespace nanfeng{
        #define cmax(x,y) ((x)>(y)?(x):(y))
        #define cmin(x,y) ((x)>(y)?(y):(x))
        #define FI FILE *IN
        #define FO FILE *OUT
        static const int N=2e5+7;
        int pos[N*10],n,m,nm;
        struct Seg{
            #define ls(x) (x<<1)
            #define rs(x) (x<<1|1)
            struct segmenttree{int l,r,len,p;}T[N<<2];
            inline void up(int x) {
                int l=ls(x),r=rs(x);
                if (!T[l].l) T[x]=T[r];
                else if (!T[r].l) T[x]=T[l];
                else {
                    T[x].l=T[l].l,T[x].r=T[r].r;
                    int l1=T[l].len,l2=T[r].len;
                    if (l1>=l2) T[x].len=l1,T[x].p=T[l].p;
                    else T[x].len=l2,T[x].p=T[r].p;
                    int len=T[r].l-T[l].r-1,ul=(len>>1)-((len&1)^1)+1,p=T[l].r+ul;
                    if (ul>T[x].len) T[x].p=p,T[x].len=ul; 
                    else if (ul==T[x].len) T[x].p=cmin(T[x].p,p);
                }
            }
            void update(int x,int p,int opt,int l,int r) {
                if (l==r) {
                    if (opt) T[x].l=T[x].r=l;
                    else T[x].l=T[x].r=0;
                    T[x].p=T[x].len=0;
                    return;
                }
                int mid(l+r>>1);
                if (p<=mid) update(ls(x),p,opt,l,mid);
                else update(rs(x),p,opt,mid+1,r);
                up(x);
            }
        }T;
        inline int main() {
            // FI=freopen("nanfeng.in","r",stdin);
            // FO=freopen("nanfeng.out","w",stdout);
            read(n),read(m);
            for (ri i(1),opt,id;i<=m;p(i)) {
                read(opt),read(id);
                if (opt==1) {
                    p(nm);
                    if (nm==1) {pos[id]=1,puts("1");T.update(1,1,1,1,n);continue;}
                    int k,ln;
                    if (T.T[1].l-1<n-T.T[1].r) k=n,ln=n-T.T[1].r;
                    else k=1,ln=T.T[1].l-1;
                    if (ln<T.T[1].len) k=T.T[1].p;
                    if (ln==T.T[1].len) k=cmin(k,T.T[1].p);
                    T.update(1,k,1,1,n);
                    printf("%d
    ",pos[id]=k);
                } else T.update(1,pos[id],0,1,n),--nm;
            }
            return 0;
        }  
    }
    int main() {return nanfeng::main();} 
    
  • 相关阅读:
    [bzoj3038/3211]上帝造题的七分钟2/花神游历各国_线段树
    [bzoj1002][FJOI2007]轮状病毒_递推_高精度
    UNIX环境高级编程——线程同步之互斥锁、读写锁和条件变量(小结)
    UNIX环境高级编程——线程与进程区别
    UNIX环境高级编程——死锁
    UNIX环境高级编程——线程同步之条件变量以及属性
    UNIX环境高级编程——线程同步之读写锁以及属性
    UNIX环境高级编程——线程同步之互斥量
    UNIX环境高级编程——pthread_create的问题
    UNIX环境高级编程——主线程与子线程的退出关系
  • 原文地址:https://www.cnblogs.com/nanfeng-blog/p/15018982.html
Copyright © 2011-2022 走看看