zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    vs错误集合及解决方案
    使用内存映射文件进行EXE、DLL通信(非MFC)
    visual studio使用小技巧(以vs2012为例)
    GetModuleHandle(NULL)获取当前DLL模块基址?
    格式化输出中的%s和%S的陷阱
    关于字符编码
    远程附加调试服务的方法
    结构体内包含位段,其数据内存分布
    微信个人公众号开发-java
    Docker-常用基建的安装与部署
  • 原文地址:https://www.cnblogs.com/ccz181078/p/7516153.html
Copyright © 2011-2022 走看看