求助:萌新调了一下午,不是妹子

P4130 [NOI2007] 项链工厂

斗神_君莫笑 @ 2019-08-25 19:30:08

#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
using namespace std;
inline int read(){
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')
        x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return x;
}
struct Node{
    int l,r,sum,lsum,rsum,lazy;
}T[2000010];
int a[500010];
inline void pushup(int p){
    T[p].lsum=T[lc].lsum;
    T[p].rsum=T[rc].rsum;
    T[p].sum=T[lc].sum+T[rc].sum-(T[lc].rsum==T[rc].lsum);
}
void build(int p,int l,int r){
    T[p].l=l;T[p].r=r;
    if(l==r){
        T[p].sum=1;
        T[p].lsum=T[p].rsum=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(lc,l,mid);
    build(rc,mid+1,r);
    pushup(p);
}
inline void pushnow(int p,int v){
    T[p].sum=1;
    T[p].lsum=T[p].rsum=v;
    T[p].lazy=v;
}
void pushdown(int p){
    if(T[p].lazy){
        pushnow(lc,T[p].lazy);
        pushnow(rc,T[p].lazy);
        T[p].lazy=0;
    }
}
void update(int p,int ql,int qr,int v){
    if(ql<=T[p].l&&T[p].r<=qr){
        pushnow(p,v);
        return;
    }
    pushdown(p);
    int mid=(T[p].l+T[p].r)>>1;
    if(ql<=mid)update(lc,ql,qr,v);
    if(qr>mid)update(rc,ql,qr,v);
    pushup(p);
}
int query(int p,int ql,int qr){
    if(ql<=T[p].l&&T[p].r<=qr)
        return T[p].sum;
    int mid=(T[p].l+T[p].r)>>1;
    pushdown(p);
    if(ql<=mid&&mid<qr)
        return query(lc,ql,qr)+query(rc,ql,qr)-(T[lc].rsum==T[rc].lsum);
    if(ql<=mid) return query(lc,ql,qr);
    if(qr>mid) return query(rc,ql,qr);
}
int query_2(int p,int q){
    if(T[p].l==T[p].r)return T[p].lsum;
    int mid=(T[p].l+T[p].r)>>1;
    pushdown(p);
    if(q<=mid)return query_2(lc,q);
    if(q>mid)return query_2(rc,q);
}
int n,m,move,turn;
int change(int k){
    if(!turn)k=(k-move+n)%n;
    else k=(n-k+move)%n;
    if(k==0)k=n;
    return k;
}
int main(){
    freopen("11.in","r",stdin);
    //freopen("1.out","w",stdout);
    n=read();m=read();
    for(int i=1;i<=n;++i)
        a[i]=read();
    build(1,1,n);
    m=read();
    for(int i=1;i<=m;++i){
        char ch=getchar();
        while(ch!='C'&&ch!='S'&&ch!='P'&&ch!='R'&&ch!='F')ch=getchar();
        if(ch=='C'){
            ch=getchar();
            if(ch=='S'){
                ch='0';
                int l,r;
                l=read();r=read();
                l=change(l);r=change(r);
                if(turn)swap(l,r);
                //printf("%d %d\n",l,r);
                if(r<l){
                    //printf("%d %d %d\n",query(1,l,n),query(1,1,r),(T[1].lsum==T[1].rsum));
                    printf("%d\n",query(1,l,n)+query(1,1,r)-(T[1].lsum==T[1].rsum));
                }
                else if((l==1&&r==n)||(l==r+1))
                    printf("%d\n",query(1,1,n)-(T[1].lsum==T[1].rsum));
                else printf("%d\n",query(1,l,r));
            }
            else printf("%d\n",query(1,1,n)-(T[1].lsum==T[1].rsum));
        }
        if(ch=='F'){
            turn^=1;
            move=(n-move)%n;
        }
        if(ch=='R'){
            int k;k=read();
            if(turn)move=(move-k+n)%n;
            else move=(move+k)%n;
        }
        if(ch=='S'){
            int l,r;
            l=read();r=read();
            l=change(l);r=change(r);
            if(turn)swap(l,r);
            int color1=query_2(1,l);
            int color2=query_2(1,r);
            update(1,l,l,color2);
            update(1,r,r,color1);
        }
        if(ch=='P'){
            int l,r,k;
            l=read();r=read();k=read();
            l=change(l);r=change(r);
            if(turn)swap(l,r);
            if(r<l)update(1,l,n,k),update(1,1,r,k);
            else update(1,l,r,k);
        }
        //printf("\nthe move is %d \n",move);
    }
    return 0;
}

sub2的时候总有几个输出少1……
边界又奇奇怪怪了


by 弹星者 @ 2019-08-25 19:33:11

性感萌新


by    吾皇 @ 2019-08-25 19:35:52

在线提问


by Wiene @ 2019-08-25 19:36:02

@斗神_君莫笑 去您的不是妹子


by ueettttuj @ 2019-08-25 19:37:06

qndmx qndbsmz

by Smile_Cindy @ 2019-08-25 19:40:55

不是妹子不看


by Wiene @ 2019-08-25 19:43:34

@Alpha 她那么可耐,怎么可能不是妹子呢?qwq


by 斗神—君莫笑 @ 2019-08-25 19:46:44

@AC鸭 鸭鸭帮个忙嘛QAQ


by Wiene @ 2019-08-25 19:48:28

@斗神—君莫笑 内个,我太弱了,不会,打扰您了qwq


by Lstdo @ 2019-08-25 20:12:13

不是妹子啊,走了走了


by 斗神—君莫笑 @ 2019-08-25 20:15:05

@Lstdo lst!!!站住!


|