萌新刚学珂朵莉树,求助
  • 板块P5350 序列
  • 楼主Arkadyevna
  • 当前回复20
  • 已保存回复20
  • 发布时间2020/7/30 09:42
  • 上次更新2023/11/6 21:48:20
查看原帖
萌新刚学珂朵莉树,求助
363937
Arkadyevna楼主2020/7/30 09:42

全部MLE了QaQ

#include<bits/stdc++.h>
using namespace std;
int n,m,a[300005];
const long long Mod=1e9+7;
struct node{
    int l,r;
    mutable long long val;
    friend bool operator<(node a,node b){
        return a.l<b.l;
    }
};
set<node>odt;
auto split(int p){
    auto itr=odt.lower_bound({p,p,0});
    if(itr!=odt.end()&&itr->l==p)
        return itr;//左闭右开
    itr--;
    int l=itr->l,r=itr->r;
    long long val=itr->val;
    odt.erase(itr);
    odt.insert({l,p-1,val});
    return odt.insert({p,r,val}).first;
}
void assign(int l,int r,long long x){
    auto itr=split(r+1),itl=split(l);
    odt.erase(itl,itr);//左闭右开。
    odt.insert({l,r,x});
}
void Plus(int l,int r,long long x){
    auto itr=split(r+1),itl=split(l);
    for(auto it=itl;it!=itr;it++)
        it->val=(it->val+x)%Mod;
}
void copy(int l,int r,int x,int y){
    auto itr=split(r+1),itl=split(l);
    auto ity=split(y+1),itx=split(x);
    odt.erase(itx,ity);
    for(auto it=itl;it!=itr;it++)
        odt.insert({it->l-l+x,it->r-l+x,it->val});
}
void trans(int l,int r,int x,int y){
    if(l>x){
        swap(l,x);
        swap(r,y);
    }
    auto itr=split(r+1),itl=split(l);
    auto ity=split(y+1),itx=split(x);
    vector<node>va,vb;
    for(auto it=itl;it!=itr;it++)
        va.push_back(*it);
    for(auto it=itx;it!=ity;it++)
        vb.push_back(*it);
    odt.erase(itl,itr);
    odt.erase(itx,ity);
    for(int i=0;i<va.size();i++)
        odt.insert({va[i].l-l+x,va[i].r-l+x,va[i].val});
    for(int i=0;i<vb.size();i++)
        odt.insert({vb[i].l-x+l,vb[i].r-x+l,vb[i].val});
}
void Poly(int l,int r){
    auto itr=split(r+1),itl=split(l);
    vector<node>va;
    for(auto it=itl;it!=itr;it++)
        va.push_back(*it);
    odt.erase(itl,itr);
    for(int i=va.size()-1;i>=0;i--){
        odt.insert({l,l+(va[i].r-va[i].l),va[i].val});
        l+=va[i].r-va[i].l+1;
    }
}
long long sum(int l,int r){
    long long res=0;
    auto itr=split(r+1),itl=split(l);
    for(auto it=itl;it!=itr;it++)
        res=(res+it->val*(it->r-it->l+1)%Mod)%Mod;
    return res;
}
void output(int l,int r){
    auto itr=odt.end(),itl=odt.begin();
    for(auto it=itl;it!=itr;it++){
        for(int i=1;i<=it->r-it->l+1;i++)
            printf("%lld ",it->val%Mod);
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        odt.insert({i,i,a[i]});
    }
    // for(int i=1,r=i;i<=n;i=r+1){
    //     while(r<n&&a[r+1]==a[i])
    //         r++;
    //     odt.insert({i,r,a[i]});
    // }
    for(int i=1;i<=m;i++){
        int op,l,r,x,y;
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d",&l,&r);
            cout<<sum(l,r)<<'\n';
        }
        if(op==2){
            scanf("%d%d%d",&l,&r,&x);
            assign(l,r,x);
        }
        if(op==3){
            scanf("%d%d%d",&l,&r,&x);
            Plus(l,r,x);
        }
        if(op==4){
            scanf("%d%d%d%d",&l,&r,&x,&y);
            copy(l,r,x,y);
        }
        if(op==5){
            scanf("%d%d%d%d",&l,&r,&x,&y);
            trans(l,r,x,y);
        }
        if(op==6){
            scanf("%d%d",&l,&r);
            Poly(l,r);
        }
    }
    output(1,n);
}
2020/7/30 09:42
加载中...