1. 程式人生 > >【UNR #1】火車管理

【UNR #1】火車管理

else pen || amp \n can signed style div

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\n",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; }

【UNR #1】火車管理