uoj#119. 【UR #8】决战圆锥曲线

http://uoj.ac/problem/119

可以认为数据基本随机,于是可以直接用线段树维护,对每个询问在线段树上进行剪枝搜索。

#include<bits/stdc++.h>
typedef long long i64;
char ib[10000007],*ip=ib,ob[10000007],*op=ob;
int _(){
    int x=0;
    while(*ip<48)++ip;
    while(*ip>47)x=x*10+*ip++-48;
    return x;
}
void pr(i64 x){
    int ss[24],sp=0;
    do ss[++sp]=x%10;while(x/=10);
    while(sp)*op++=ss[sp--]+48;
    *op++=10;
}
i64 max(i64 a,i64 b){return a>b?a:b;}
int n,m,seed,_l,_r;
i64 A,B,C,ans;
int mt(){
    seed=(seed*100000005ll+20150609)%998244353;
    return seed/100;
}
struct node{
    node*lc,*rc;
    int L,R,M;
    int rv;
    i64 y1,y2,xy1,xy2;
    void _rv(){
        std::swap(y1,y2);
        std::swap(xy1,xy2);
        rv^=1;
    }
    void dn(){
        if(rv){
            rv=0;
            lc->_rv();
            rc->_rv();
        }
    }
    void up(){
        y1=max(lc->y1,rc->y1);
        y2=max(lc->y2,rc->y2);
        xy1=max(lc->xy1,rc->xy1);
        xy2=max(lc->xy2,rc->xy2);
    }
    void init(int v){
        y1=v,y2=100000-v;
        xy1=i64(L)*y1,xy2=i64(L)*y2;
    }
    void chg(){
        if(L==R)return init(A);
        dn();
        (_l<=M?lc:rc)->chg();
        up();
    }
    void rev(){
        if(_l<=L&&R<=_r)return _rv();
        dn();
        if(_l<=M)lc->rev();
        if(_r>M)rc->rev();
        up();
    }
    i64 cal(){
        return A*R+B*y1+C*xy1;
    }
    void find(i64 v){
        if(_l>R||_r<L||v<=ans)return;
        if(L==R)return void(ans=v);
        dn();
        i64 vl=lc->cal(),vr=rc->cal();
        if(vl>vr)lc->find(vl),rc->find(vr);
        else rc->find(vr),lc->find(vl);
    }
}ns[200007],*np=ns,*rt;
node*build(int L,int R){
    node*w=np++;
    w->L=L,w->R=R;
    if(L<R){
        int M=w->M=L+R>>1;
        w->lc=build(L,M);
        w->rc=build(M+1,R);
        w->up();
    }else w->init(mt()%100001);
    return w;
}
int main(){
    fread(ib,1,sizeof(ib),stdin);
    n=_(),m=_(),seed=_();
    rt=build(1,n);
    while(m--){
        int o=_();
        if(o=='C'-48){
            _l=mt()%n+1,A=mt()%100001;
            rt->chg();
        }else{
            _l=mt()%n+1,_r=mt()%n+1;
            if(_l>_r)std::swap(_l,_r);
            if(o=='R'-48){
                rt->rev();
            }else{
                A=_(),B=_(),C=_();
                ans=0;
                if(A|B|C)rt->find(rt->cal());
                pr(ans);
            }
        }
    }
    fwrite(ob,1,op-ob,stdout);
    return 0;
}
原文地址:https://www.cnblogs.com/ccz181078/p/7516153.html