zoukankan      html  css  js  c++  java
  • 【UNR #1】火车管理

    SOL:

     可持久化数据结构了解一下。

    #include<bits/stdc++.h>
    #define N 4000021
    #define M (N*25)
    #define Mid (l+r>>1)
    #define Ls no<<1,l,Mid
    #define Rs no<<1|1,Mid+1,r
    using namespace std;
    int ans,pre[N],rt[N],lazy[N];
    struct Q_tree{
        int lazy[M],tot,ls[M],rs[M];
        void down(int id){
            if (-1==lazy[id]) return;
            ++tot; lazy[tot]=lazy[id];ls[tot]=ls[ls[id]];rs[tot]=rs[ls[id]];ls[id]=tot;
            ++tot; lazy[tot]=lazy[id];ls[tot]=ls[rs[id]];rs[tot]=rs[rs[id]];rs[id]=tot;
            lazy[id]=-1;
        }
        void que(int now,int l,int r,int x){
            if (~lazy[now]||!now) {ans=lazy[now]; return; }
            if (x<=Mid) que(ls[now],l,Mid,x);
            else que(rs[now],Mid+1,r,x);
        }
        void change(int last,int& now,int l,int r,int L,int R,int to){
            now=++tot;
            if (L<=l&&r<=R) {lazy[now]=to; return;}
            if (last) down(last);
            ls[now]=ls[last],rs[now]=rs[last];
            if (L<=Mid) change(ls[last],ls[now],l,Mid,L,R,to);
            if (R> Mid) change(rs[last],rs[now],Mid+1,r,L,R,to);
        }
    }Q;
    inline void push(int no,int l,int r){
        if (lazy[no]==-1) return;
        lazy[no<<1]=lazy[no<<1|1]=lazy[no];
        pre[no<<1]=lazy[no]*(Mid-l+1); pre[no<<1|1]=lazy[no]*(r-Mid); 
        lazy[no]=-1;
    }
    void que(int no,int l,int r,int L,int R){
        if (L<=l&&r<=R) {ans+=pre[no];return;}
        push(no,l,r);
        if (L<=Mid) que(Ls,L,R);
        if (R >Mid) que(Rs,L,R);
    }
    void change(int no,int l,int r,int L,int R,int o){
        if (L<=l&&r<=R) {
            pre[no]=(r-l+1)*o; lazy[no]=o;
            return;
        }
        push(no,l,r);
        if (L<=Mid) change(Ls,L,R,o);
        if (R> Mid) change(Rs,L,R,o); 
        pre[no]=pre[no<<1]+pre[no<<1|1];
    }
    void out(int no,int l,int r){
        if (l==r) {printf("%d ",pre[no]); return;}
        push(no,l,r);
        out(Ls); out(Rs);
    }
    int n,m,tj,op,l,r,last,Pow[N>>1];
    signed main () {
    //    freopen("ex.in","r",stdin);
    //    freopen("ex.out","w",stdout);
        memset(lazy,-1,sizeof lazy);
        memset(Q.lazy,-1,sizeof Q.lazy);
        scanf("%d%d%d",&n,&m,&tj);
        for (int t=1;t<=m;t++){
            scanf("%d",&op);
            if (op==1) {
                scanf("%d%d",&l,&r);
                l=(l+last*tj)%n+1;
                r=(r+last*tj)%n+1;
                if (l>r) swap(l,r);
                ans=0;
                que(1,1,n,l,r);
                rt[t]=rt[t-1];
                printf("%d
    ",last=ans);
            }
            if (op==2) {
                scanf("%d",&l);
                l=(l+last*tj)%n+1;
                Q.que(rt[t-1],1,n,l);
                if (ans==-1) {rt[t]=rt[t-1]; continue;}
                Q.que(rt[ans-1],1,n,l);
                Q.change(rt[t-1],rt[t],1,n,l,l,ans);
                change(1,1,n,l,l,Pow[ans]);
            }
            if (op==3) {
                scanf("%d%d%d",&l,&r,&Pow[t]);
                l=(l+last*tj)%n+1;
                r=(r+last*tj)%n+1;
                if (l>r) swap(l,r);
                change(1,1,n,l,r,Pow[t]);
                Q.change(rt[t-1],rt[t],1,n,l,r,t);
            }
    //        out(1,1,n); puts("");
        }
        return 0;
    } 
  • 相关阅读:
    《VC++深入详解》学习笔记 第十二章 文件和注册表操作
    《VC++深入详解》学习笔记 第九章 定制应用程序外观
    《VC++深入详解》学习笔记 第七、八章对话框
    《VC++深入详解》学习笔记 第六章 菜单
    《VC++深入详解》学习笔记 第五章 文本编程
    《VC++深入详解》学习笔记 第四章 简单绘图
    《VC++深入详解》学习笔记 第三章 MFC框架程序剖析
    Inno_Setup使用笔记(简单完成安装包制作)
    《VC++深入详解》学习笔记 第一章 Windows程序内部运行机制
    搭建eclipse的nodejs开发环境图解
  • 原文地址:https://www.cnblogs.com/rrsb/p/9335788.html
Copyright © 2011-2022 走看看