ODT60分求助,WA 2 3 8 10
  • 板块P5350 序列
  • 楼主awa2333
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/11/18 21:30
  • 上次更新2023/10/27 02:28:48
查看原帖
ODT60分求助,WA 2 3 8 10
759015
awa2333楼主2022/11/18 21:30

调了一整天了,还是寄

#include <iostream>
#include <set>
#include <vector>
using namespace std;
using ll=long long;
ll n,m;
constexpr ll mod=1000000007;
struct node{
    ll l,r;
    mutable ll v;
    node(ll l_,ll r_=-1,ll v_=0)
        :l{l_},r{r_},v{v_}{}
    bool operator<(const node& o)const{
        return l<o.l;
    }
};
set<node> odt;
// void dbg(){
//     for(auto i:odt){
//         cout<<i.l<<" "<<i.r<<" "<<i.v<<endl;
//     }
//     cout<<"======="<<endl;
// }
using iter_t=set<node>::iterator;
auto split(ll x){
    if(x>n)return odt.end();
    auto it=--odt.upper_bound(node{x});
    if(it->l==x)return it;
    auto l=it->l,r=it->r,v=it->v;
    odt.erase(it);
    odt.insert(node{l,x-1,v});
    return odt.insert(node{x,r,v}).first;
}
void assign(ll l,ll r,ll v){
    auto itr=split(r+1),itl=split(l);
    odt.erase(itl,itr);
    odt.insert(node{l,r,v});
}
ll sum(ll l,ll r){
    auto itr=split(r+1),itl=split(l);
    ll ans=0;
    for(auto i=itl;i!=itr;++i){
        ans=(ans+i->v*(i->r-i->l+1))%mod;
    }
    return ans;
}
void add(ll l,ll r,ll v){
    auto itr=split(r+1),itl=split(l);
    for(auto i=itl;i!=itr;++i){
        i->v+=v;
        i->v%=mod;
    }
}
void copy(ll l1,ll r1,ll l2,ll r2){
    auto itr=split(r1+1),itl=split(l1);
    vector t(itl,itr);
    itr=split(r2+1),itl=split(l2);
    odt.erase(itl,itr);
    // cout<<"t: ";
    // for(auto i:t){
    //     cout<<i.l<<" ";
    // }
    // cout<<endl;
    for(auto& i:t){
        // cout<<"insert "<<i.l-l1+l2<<" "<<i.r-l1+l2<<" "<<i.v<<endl;
        odt.insert(node{i.l-l1+l2,i.r-l1+l2,i.v});
    }
}
void swap(ll l1,ll r1,ll l2,ll r2){
    auto itr1=split(r1+1),itl1=split(l1);
    vector t1(itl1,itr1);
    odt.erase(itl1,itr1);
    auto itr2=split(r2+1),itl2=split(l2);
    vector t2(itl2,itr2);
    odt.erase(itl2,itr2);
    // cout<<"FUCK{"<<endl;
    // dbg();
    // cout<<"}FUCK"<<endl;
    // cout<<"t1: ";
    // for(auto i:t1){
    //     cout<<i.l<<" ";
    // }
    // cout<<endl;
    // cout<<"t2: ";
    // for(auto i:t2){
    //     cout<<i.l<<" ";
    // }
    // cout<<endl;
    for(auto& i:t1){
        odt.insert(node{i.l-l1+l2,i.r-l1+l2,i.v});
        // cout<<"insert t1 "<<i.l-l1+l2<<" "<<i.r-l1+l2<<" "<<i.v<<endl;
    }
    for(auto& i:t2){
        odt.insert(node{i.l-l2+l1,i.r-l2+l1,i.v});
        // cout<<"insert t2 "<<i.l-l2+l1<<" "<<i.r-l2+l1<<" "<<i.v<<endl;
    }
}
void reverse(ll l,ll r){
    auto itr=split(r+1),itl=split(l);
    vector<node> t{itl,itr};
    odt.erase(itl,itr);
    ll ll=l;
    for(auto i=t.rbegin();i!=t.rend();++i){
        odt.insert(node{ll,ll+i->r-i->l,i->v});
        ll+=i->r-i->l+1;
    }
}
int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cin>>n>>m;
    node t{1,1};
    cin>>t.v;
    ll last=t.v;
    for(ll i=2;i<=n;++i){
        ll x;
        cin>>x;
        if(x!=last){
            odt.insert(t);
            t.l=i;
            t.r=i;
            t.v=x;
        }
        t.r=i;
        last=x;
    }
    odt.insert(t);
    // odt.insert(node{n+1,n+1,114514});
    // dbg();
    for(ll i=1;i<=m;++i){
        ll op,l,r,a,b;
        cin>>op>>l>>r;
        // cout<<"operator "<<i<<": "<<endl;
        if(op==1){
            // cout<<"sum "<<l<<" "<<r<<endl;
            cout<<sum(l,r)<<"\n";
        }else if(op==2){
            cin>>a;
            // cout<<"assign "<<l<<" "<<r<<" "<<a<<endl;
            assign(l,r,a);
        }else if(op==3){
            cin>>a;
            // cout<<"add "<<l<<" "<<r<<" "<<a<<endl;
            add(l,r,a);
        }else if(op==4){
            cin>>a>>b;
            // if(l>a){
            //     swap(l,a);
            //     swap(r,b);
            // }
            // cout<<"copy "<<l<<" "<<r<<" "<<a<<" "<<b<<endl;
            copy(l,r,a,b);
        }else if(op==5){
            cin>>a>>b;
            // if(l>a){
            //     swap(l,a);
            //     swap(r,b);
            // }
            // cout<<"swap "<<l<<" "<<r<<" "<<a<<" "<<b<<endl;
            swap(l,r,a,b);
        }else{
            // cout<<"reverse "<<l<<" "<<r<<endl;
            reverse(l,r);
        }
        // dbg();
    }
    // cout<<odt.size()<<endl;
    // dbg();
    for(auto i:odt){
        for(ll j=i.l;j<=i.r;++j){
            cout<<i.v%mod<<" ";
        }
    }
}
~~~
2022/11/18 21:30
加载中...