珂朵莉树全RE求助
  • 板块P5350 序列
  • 楼主Gao_yc
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/11/19 19:04
  • 上次更新2023/10/27 02:20:00
查看原帖
珂朵莉树全RE求助
255581
Gao_yc楼主2022/11/19 19:04

rt

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e5+10;
const int mod=1e9+7;
int n,m;
struct chtholly{
	int l,r;
	mutable ll v;
	bool operator<(const chtholly &A)const{return l<A.l;}
}a[N],b[N];
set<chtholly> s;
set<chtholly>::iterator split(int x){
	set<chtholly>::iterator it=s.lower_bound((chtholly){x,0,0});
	if(it!=s.end()&&it->l==x) return it;
	it--;
	if(it->r<x) return s.end();
	int l=it->l,r=it->r;ll v=it->v;
	s.erase(it);
	s.insert((chtholly){l,x-1,v});
	return s.insert((chtholly){x,r,v}).first;
}
void assign(int l,int r,ll x){
	set<chtholly>::iterator itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert((chtholly){l,r,x});
}
void add(int l,int r,ll x){
	set<chtholly>::iterator itr=split(r+1),itl=split(l);
	for(set<chtholly>::iterator it=itl;it!=itr;++it) it->v=(it->v+x)%mod;
}
void copy(int l_1,int r_1,int l_2,int r_2){
	int len=0;
	set<chtholly>::iterator itr=split(r_1+1),itl=split(l_1);
	for(set<chtholly>::iterator it=itl;it!=itr;++it) a[++len]=(chtholly){it->l+l_2-l_1,it->r+l_2-l_1,it->v};
	itr=split(r_2+1),itl=split(l_2);
	s.erase(itl,itr);
	for(;len;--len) s.insert(a[len]);
}
void cswap(int l_1,int r_1,int l_2,int r_2){
	int lena=0,lenb=0;
	set<chtholly>::iterator itr=split(r_1+1),itl=split(l_1);
	for(set<chtholly>::iterator it=itl;it!=itr;++it) a[++lena]=(chtholly){it->l+l_2-l_1,it->r+l_2-l_1,it->v};
	s.erase(itl,itr);
	itr=split(r_2+1),itl=split(l_2);
	for(set<chtholly>::iterator it=itl;it!=itr;++it) b[++lenb]=(chtholly){it->l-l_2+l_1,it->r-l_2+l_1,it->v};
	s.erase(itl,itr);
	for(;lena;--lena) s.insert(a[lena]);
	for(;lenb;--lenb) s.insert(b[lenb]);
}
void creverse(int l,int r){
	set<chtholly>::iterator itr=split(r+1),itl=split(l);
	int len=0;
	for(set<chtholly>::iterator it=itl;it!=itr;++it) a[++len]=(chtholly){r+l-it->l,r+l-it->r,it->v};
	s.erase(itl,itr);
	for(;len;--len) s.insert(a[len]);
}
ll query(int l,int r){
	set<chtholly>::iterator itr=split(r+1),itl=split(l);
	ll res=0;
	for(set<chtholly>::iterator it=itl;it!=itr;++it) res=(res+it->v*(it->r-it->l+1)%mod)%mod;
	return res;
}
int main()
{
//	freopen("","r",stdin);
//	freopen("","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1,a;i<=n;++i) scanf("%d",&a),s.insert((chtholly){i,i,a});
	int op,l_1,r_1,l_2,r_2;
	ll v;
	while(m--){
		scanf("%d%d%d",&op,&l_1,&r_1);
		if(op==1) printf("%lld\n",query(l_1,r_1));
		else if(op==2) scanf("%lld",&v),assign(l_1,r_1,v);
		else if(op==3) scanf("%lld",&v),add(l_1,r_1,v);
		else if(op==4) scanf("%d%d",&l_2,&r_2),copy(l_1,r_1,l_2,r_2); 
		else if(op==5) scanf("%d%d",&l_2,&r_2),cswap(l_1,r_1,l_2,r_2); 
		else creverse(l_1,r_1);
	}
	for(set<chtholly>::iterator it=s.begin();it!=s.end();++it)
		for(int i=it->l;i<=it->r;++i) printf("%lld ",it->v);
    return 0;
}

2022/11/19 19:04
加载中...