WA 0pts 求救
  • 板块P5350 序列
  • 楼主yinbe2
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/16 16:09
  • 上次更新2024/3/16 17:48:12
查看原帖
WA 0pts 求救
1285691
yinbe2楼主2024/3/16 16:09

提交记录

#include<iostream>
#include<set>
using namespace std;
int n,m,a[300005];
const int mod=1e9+7;
struct node
{
	int l,r;
	mutable int v;
	bool operator<(const node &o)const
	{
		return l<o.l;
	}
};
set<node>t;
auto _split(int m)
{
	auto it=t.upper_bound({m,0,0});
	it--;
	if(m==it->l)return it;
	int l=it->l,r=it->r,v=it->v;
	t.erase(it);
	t.insert({l,m-1,v});
	return t.insert({m,r,v}).first;
}
void _assign(int l,int r,int v)
{
	auto itr=_split(r+1);
	auto itl=_split(l);
	t.erase(itl,itr);
	t.insert({l,r,v});
	return;
}
void add(int l,int r,int v)
{
	auto itr=_split(r+1);
	for(auto it=_split(l);it!=itr;it++)
	{
		it->v+=v*(it->r-it->l+1);
		it->v%=mod; 
	}	
	return;
}
node t1[300005],t2[300005];
void _swap(int l1,int r1,int l2,int r2)
{
	if(l1>l2)swap(l1,l2),swap(r1,r2);
	int len1=0,len2=0;
	auto itr1=_split(r1+1);
	auto itl1=_split(l1);	
	for(auto it=itl1;it!=itr1;it++)t1[++len1]=*it;
	t.erase(itl1,itr1);
	auto itr2=_split(r2+1);
	auto itl2=_split(l2);
	for(auto it=itl2;it!=itr2;it++)t2[++len2]=*it;	
	t.erase(itl2,itr2);
	for(int i=1;i<=len2;i++)t.insert({l1+t2[i].l-l2,l1+t2[i].r-l2,t2[i].v});
	for(int i=1;i<=len1;i++)t.insert({l2+t1[i].l-l1,l2+t1[i].r-l1,t1[i].v});
    return;
}
void _copy(int l1,int r1,int l2,int r2)
{
	
	auto itr2=_split(r2+1);
	auto itl2=_split(l2);
	t.erase(itl2,itr2);	
	auto itr1=_split(r1+1);
	auto itl1=_split(l1);		
	for(auto it=itl1;it!=itr1;it++)
	{
		t.insert({l2+it->l-l1,l2+it->r-l1,it->v});
	}
}
void _reverse(int l,int r)
{	
    auto itr=_split(r+1);
	auto itl=_split(l);
	int len=0;
	for(auto it=itl;it!=itr;it++)
	{
		t1[++len]=*it;
	}
    t.erase(itl,itr);
    for(int i=len;i>=1;i--)
    {
        t.insert({l+r-t1[i].r,l+r-t1[i].l,t1[i].v});
    }	 
    return;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
        t.insert({i,i,a[i]});
	}
    t.insert({n+1,n+1,-1});
	while(m--)
	{
		int flag;
		scanf("%d",&flag);
		if(flag==1)
		{
			int l,r;
			scanf("%d%d",&l,&r);
			if(l>r)swap(l,r);
			long long ans=0;
			auto itr=_split(r+1);
			for(auto it=_split(l);it!=itr;it++)
			{
				ans+=it->v;
				ans%=mod; 
			}
			printf("%lld\n",ans);
		}
		else if(flag==2)
		{
			int l,r,v;
			scanf("%d%d%d",&l,&r,&v);
			if(l>r)swap(l,r);
			_assign(l,r,v);
		}
		else if(flag==3)
		{
			int l,r,v;
			scanf("%d%d%d",&l,&r,&v);
			if(l>r)swap(l,r);
			add(l,r,v);
		}
		else if(flag==4)
		{
			int l1,r1,l2,r2;
			scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
			if(l1>r1)swap(l1,r1);
			if(l2>r2)swap(l2,r2);
			_copy(l1,r1,l2,r2);
		}
		else if(flag==5)
		{
			int l1,r1,l2,r2;
			scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
			if(l1>r1)swap(l1,r1);
			if(l2>r2)swap(l2,r2);			
			_swap(l1,r1,l2,r2);
		}
		else if(flag==6)
		{
			int l,r;
			scanf("%d%d",&l,&r);
			if(l>r)swap(l,r);
			_reverse(l,r);
		}
		else
		{
			printf("终于写完珂朵莉了!!!"); 
		}		
	}
    for(auto it=t.begin();it!=t.end();it++)
    {
    	if(it->v==-1)break;
        for(int j=it->l;j<=it->r;j++)
        {
            printf("%d ",it->v);
        }
    }
    return 0;
}	
2024/3/16 16:09
加载中...