ODT 求调
  • 板块P5350 序列
  • 楼主UncleSam_Died
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/11/13 17:55
  • 上次更新2024/11/13 20:38:57
查看原帖
ODT 求调
378996
UncleSam_Died楼主2024/11/13 17:55

全 MLE 了……

#include<set>
#include<math.h>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<valarray>
#include<algorithm>
#define N 300005
#define Mod 1000000007
namespace FastIO{
    inline void read(int &x){
        x=0; char ch=getchar(); bool f=1;
        while(ch<'0'||ch>'9') f^=(ch=='-'),ch=getchar();
        while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=f?x:-x; return;
    }
    inline void put(int x){
        if(x<0) putchar('-'),x=-x;
        if(x>9) put(x/10);
        putchar(x%10+'0');
    }
    inline void write(int x,char ch='\n'){
        put(x); putchar(ch); return;
    }
}
using FastIO::read;
using FastIO::write;
inline void gmin(int &a,int b){a=a<b?a:b;}
inline void gmax(int &a,int b){a=a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
struct Chtholly{
    int l,r; mutable int v;
    inline bool operator <(
        const Chtholly &o
    ) const {return l<o.l;}
    Chtholly(int L,int R,int V)
        : l(L),r(R),v(V) {}
};
struct ODT{
    std::set<Chtholly> s;
    #define it std::set<Chtholly>::iterator
    inline it split(int p){
        auto pos=s.lower_bound(Chtholly(p,-1,0));
        if(pos!=s.end()&&pos->l==p)
            return pos; --pos;
        int l=pos->l,r=pos->r,v=pos->v;
        s.erase(pos),s.insert(Chtholly(l,p-1,v));
        return s.insert(Chtholly(p,r,v)).first;
    }
    inline void assign(int l,int r,int v){
        auto rpos=split(r+1),lpos=split(l);
        s.erase(lpos,rpos),s.insert({l,r,v});
    }
    inline void add(int l,int r,int v){
        auto rpos=split(r+1),lpos=split(l);
        for(;lpos!=rpos;++lpos) (lpos->v+=v)%=Mod;
    }
    inline void copy(int l1,int r1,int l2,int r2){
        auto rpos1=split(r1+1),lpos1=split(l1);
        std::vector<Chtholly> vec;
        for(;lpos1!=rpos1;++lpos1)
            vec.push_back(*lpos1);
        auto rpos2=split(r2+1),lpos2=split(l2);
        s.erase(lpos2,rpos2);
        for(auto [L,R,V]:vec)
            s.insert(Chtholly(L+l2-l1,R+l2-l1,V));
    }
    inline void swap(int l1,int r1,int l2,int r2){
        auto rpos1=split(r1+1),lpos1=split(l1);
        auto rpos2=split(r2+1),lpos2=split(l2);
        std::vector<Chtholly> vec1,vec2;
        for(;lpos1!=rpos1;++lpos1) vec1.push_back(*lpos1);
        for(;lpos2!=rpos2;++lpos2) vec2.push_back(*lpos2);
        for(auto now:vec2) s.erase(now);
        for(auto [L,R,V]:vec1)
            s.insert(Chtholly(L+l2-l1,R+l2-l1,V));
        for(auto now:vec1) s.erase(now);
        for(auto [L,R,V]:vec2)
            s.insert(Chtholly(L+l1-l2,R+l1-l2,V));
    }
    inline void reverse(int l,int r){
        auto rpos=split(r+1),lpos=split(l);
        std::vector<Chtholly> vec;
        auto lin=lpos;
        for(;lpos!=rpos;++lpos)
            vec.push_back(*lpos);
        for(auto now:vec) s.erase(now);
        for(auto [L,R,V]:vec)
            s.insert(Chtholly(r-R+l,r-L+l,V));
    }
    inline int len(it pos){
        return pos->r-pos->l+1;
    }
    inline int sum(int l,int r){
        auto rpos=split(r+1),lpos=split(l);
        int res=0; for(; lpos!=rpos;++lpos)
            (res+=lpos->v*len(lpos)%Mod)%=Mod;
        return res;
    }
    inline void insert(int l,int r,int v){
        s.insert(Chtholly(l,r,v));
    }
}odt;
int n,q,a[N];
signed main(){
    read(n),read(q);
    for(int i=1;i<=n;++i)
        read(a[i]);
    for(int i=1;i<=n;++i)
        odt.insert(i,i,a[i]);
    odt.insert(n+1,n+1,0);
    int l1=0,r1=0,l2=0,r2,v;
    int opt,l,r; while(q--){
        read(opt); switch (opt){
            case 1: read(l),read(r),write(odt.sum(l,r)); break;
            case 2: read(l),read(r),read(v),odt.assign(l,r,v); break;
            case 3: read(l),read(r),read(v),odt.add(l,r,v); break;
            case 4: read(l1),read(r1),read(l2),read(r2),odt.copy(l1,r1,l2,r2); break;
            case 5: read(l1),read(r1),read(l2),read(r2),odt.swap(l1,r1,l2,r2); break;
            case 6: read(l),read(r),odt.reverse(l,r); break;
        }
        // for(int i=1;i<=n;++i) write(odt.sum(i,i),' '); putchar('\n');
    } for(int i=1;i<=n;++i) write(odt.sum(i,i),' ');
    // system("pause");
}
}
2024/11/13 17:55
加载中...