珂朵莉树RE 0分求救
  • 板块P5350 序列
  • 楼主yinbe
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/20 21:50
  • 上次更新2023/12/21 12:52:58
查看原帖
珂朵莉树RE 0分求救
759152
yinbe楼主2023/12/20 21:50
#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)
{
	auto itr1=split(r1+1);
	auto itr2=split(r2+1);
	auto itl1=split(l1);
	auto itl2=split(l2);
	int len1=0,len2=0;
	for(auto it=itl1;it->r!=r1;it++)
	{
		t1[++len1]=*it;
	}
	for(auto it=itl2;it->r!=r2;it++)
	{
		t2[++len2]=*it;
	}
	t.erase(itl1,itr1);
	t.erase(itl2,itr2);
	for(int i=1;i<=len1;i++)t.insert({l2+t1[i].l-l1,l2+t1[i].r-l1,t1[i].v});
	for(int i=1;i<=len2;i++)t.insert({l1+t2[i].l-l2,l1+t2[i].r-l2,t2[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->r!=r;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,0});
	while(m--)
	{
		int flag;
		scanf("%d",&flag);
		if(flag==1)
		{
			int l,r;
			scanf("%d%d",&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);
			assign(l,r,v);
		}
		else if(flag==3)
		{
			int l,r,v;
			scanf("%d%d%d",&l,&r,&v);
			add(l,r,v);
		}
		else if(flag==4)
		{
			int l1,r1,l2,r2;
			scanf("%d%d%d%d",&l1,&r1,&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);
			_swap(l1,r1,l2,r2);
		}
		else if(flag==6)
		{
			int l,r;
			scanf("%d%d",&l,&r);
			_reverse(l,r);
		}
		else
		{
			printf("终于写完珂朵莉了!!!"); 
		}
	}
    for(auto it=t.begin();it!=t.end();it++)
    {
        for(int j=it->l;j<=it->r;j++)
        {
            printf("%d ",it->v);
        }
    }
}

提交记录

2023/12/20 21:50
加载中...