odt re求调教
  • 板块P5350 序列
  • 楼主_AyachiNene
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/8 22:47
  • 上次更新2023/11/8 22:49:13
查看原帖
odt re求调教
754502
_AyachiNene楼主2023/11/8 22:47

rt,去掉Swap就不会re

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int f=1,res=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){res=(res<<1)+(res<<3)+(c^48);c=getchar();}
	return res*f;
}
const int mod=1e9+7;
struct node
{
	int l,r;
	mutable int val;
	node(int l,int r=0,int val=0):l(l),r(r),val(val){}
	bool operator<(const node &a)const
	{
		return l<a.l;
	}
};
struct tmp
{
	int l,r,val;
}tmp1[114514*3],tmp2[114514*3];
int cnt;
#define ittor set<node>::iterator
set<node>odt;
ittor split(int pos)
{
	ittor it=odt.lower_bound(node(pos));
	if(it!=odt.end()&&it->l==pos)
		return it;
	--it;
	if(it->r<pos)
		return odt.end();
	int l=it->l;
	int r=it->r;
	int val=it->val;
	odt.erase(it);
	odt.insert(node(l,pos-1,val));
	return odt.insert(node(pos,r,val)).first;
}
int sum(int l,int r)
{
	ittor itr=split(r+1),itl=split(l);
	int res=0;
	for(ittor it=itl;it!=itr;it++)
		res=(res+it->val*(it->r-it->l+1)%mod)%mod;
	return res;
}
void assign(int l,int r,int x)
{
	ittor itr=split(r+1),itl=split(l);
	odt.erase(itl,itr);
	odt.insert(node(l,r,x));
}
void add(int l,int r,int x)
{
	ittor itr=split(r+1),itl=split(l);
	for(ittor it=itl;it!=itr;it++)
		it->val=(it->val+x)%mod;
}
void copy(int l1,int r1,int l2,int r2)
{
	ittor itr=split(r1+1),itl=split(l1);
	cnt=0;
	for(ittor it=itl;it!=itr;it++)
	{
		tmp1[++cnt].l=it->l;
		tmp1[cnt].r=it->r;
		tmp1[cnt].val=it->val;
	}
	itr=split(r2+1),itl=split(l2);
	odt.erase(itl,itr);
	for(int i=1;i<=cnt;i++)
		odt.insert(node(tmp1[i].l-l1+l2,tmp1[i].r-l1+l2,tmp1[i].val));
}
inline void Swap(int l1,int r1,int l2,int r2)
{
	int len1=0,len2=0;
	ittor itr=split(r1+1),itl=split(l1);
	for(ittor it=itl;it!=itr;it++)
	{
		tmp1[++len1].l=it->l;
		tmp1[len1].r=it->r;
		tmp1[len1].val=it->val;
	}
	odt.erase(itl,itr);
	itr=split(r2+1),itl=split(l2);
	for(ittor it=itl;it!=itr;it++)
	{
		tmp2[++len2].l=it->l;
		tmp2[len2].r=it->r;
		tmp2[len2].val=it->val;
	}
	odt.erase(itl,itr);
	for(int i=1;i<=len1;i++) 
		odt.insert(node(tmp2[i].l-l2+l1,tmp2[i].r-l2+l1,tmp2[i].val));
 	for(int i=1;i<=len1;i++) 
 		odt.insert(node(tmp1[i].l-l1+l2,tmp1[i].r-l1+l2,tmp1[i].val));
}
void Reverse(int l,int r)
{
	ittor itr=split(r+1),itl=split(l);
	cnt=0;
	for(ittor it=itl;it!=itr;it++)
	{
		tmp1[++cnt].l=it->l;
		tmp1[cnt].r=it->r;
		tmp1[cnt].val=it->val;
	}
	odt.erase(itl,itr);
	for(int i=1;i<=cnt;i++)
		odt.insert(node(r-tmp1[i].r+l,r-tmp1[i].l+l,tmp1[i].val));
}
int n,m;
int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		int x=read();
		odt.insert(node(i,i,x));
	}
	while(m--)
	{
		int op=read(),l1=read(),r1=read(),l2,r2,x;
		if(op==1)
			cout<<sum(l1,r1)<<endl;
		else if(op==2)
			x=read(),assign(l1,r1,x);
		else if(op==3)
			x=read(),add(l1,r1,x);
		else if(op==4)
			l2=read(),r2=read(),copy(l1,r1,l2,r2);
		else if(op==5)
			l2=read(),r2=read(),Swap(l1,r1,l2,r2);
		else
			Reverse(l1,r1);
	}
	ittor itr=split(n+1),itl=split(1);
	for(ittor it=itl;it!=itr;it++)
		for(int i=it->l;i<=it->r;i++)
			cout<<it->val<<" ";
}
2023/11/8 22:47
加载中...