珂朵莉树求助
  • 板块P5350 序列
  • 楼主AzureHair
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/19 21:58
  • 上次更新2023/10/27 06:50:36
查看原帖
珂朵莉树求助
557510
AzureHair楼主2022/10/19 21:58
#include<bits/stdc++.h>
using namespace std;
int n,m;
/*struct node{
	int l,r;
	mutable int v;
	node(int l,int r=0,int v=0):l(l),r(r),v(v) {}
	bool operator <(const node &x) const
	{
		return l<x.l;
	}
}a[500010],b[500010];*/
struct node
{
	int l,r;
	mutable long long v;
	node(int L=0,int R=-1,int V=0):l(L),r(R),v(V){}
	friend bool operator <(const node &a,const node &b){return a.l<b.l;} 
//	int len(){return r-l+1;}
};
node a[1000010],b[1000010];
set<node> s;
inline int read()
{
	register int x=0,y=1;register char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')y=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*y;
}
set<node>::iterator split(int pos)
{
	set<node>::iterator it=s.lower_bound(node(pos));
	if(it->l==pos&&it!=s.end())
	{
		return it;
	}
	it--;
	if(pos>it->r)
	{
		return s.end();
	}
	int l=it->l;
	int r=it->r;
	int v=it->v;
	s.erase(it);
	s.insert(node(l,pos,v));
	return s.insert(node(pos+1,r,v)).first;
}
long long query(int l,int r)
{
	set<node>::iterator itr=split(r+1),itl=split(l);
	long long ans=0;
	for(set<node>::iterator it=itl;it!=itr;it++)
	{
		ans=(ans+it->v*(it->r-it->l+1))%1000000007;
	}
	return ans;
}
void assign(int l,int r,long long x)
{
	set<node>::iterator itr=split(r+1),itl=split(l);
	s.erase(itl,itr);
	s.insert(node(l,r,x%1000000007));
	return ;
}
void change(int l,int r,long long x)
{
	set<node>::iterator itr=split(r+1),itl=split(l);
	for(set<node>::iterator it=itl;it!=itr;it++)
	{
		it->v=(it->v+x)%1000000007;
	}
	return ;
}
void rcopy(int l1,int r1,int l2,int r2)
{
	set<node>::iterator itr=split(r1+1),itl=split(l1);
    //vector<node> a;
    int len=0;
    for(;itl!=itr;itl++)
	{
		a[++len].l=itl->l;
		a[len].r=itl->r;
		a[len].v=itl->v;
	}
    set<node>::iterator r=split(r2+1),l=split(l2);
    s.erase(l,r);
    for(int i=1;i<=len;i++)
	{
		s.insert(node(l2+a[i].l-l1,l2+a[i].r-l1,a[i].v));
	}
}
void exchange(int l1,int r1,int l2,int r2)
{
	set<node>::iterator itr=split(r1+1),itl=split(l1),l=itl,r=itr;
    //vector<node> a,b;
    int len1=0,len2=0;
    for(;itl!=itr;itl++)
	{
		a[++len1].l=itl->l;
		a[len1].r=itl->r;
		a[len1].v=itl->v;
	}
    s.erase(l,r);
    itr=split(r2+1),itl=split(l2);
    l=itl;
	r=itr;
    for(;itl!=itr;itl++)
	{
		b[++len2].l=itl->l;
		b[len2].r=itl->r;
		b[len2].v=itl->v;
	}
    s.erase(l,r);
    for(int i=1;i<=len2;i++)
	{
		s.insert(node(l1+b[i].l-l2,l1+b[i].r-l2,b[i].v));
	}
    for(int i=1;i<=len1;i++)
	{
		s.insert(node(l2+a[i].l-l1,l2+a[i].r-l1,a[i].v));
	}
	/*set<node>::iterator itr=split(r1+1),itl=split(l1),it1r=split(r2+1),it1l=split(l2);
	vector<node> b;
	for(set<node>::iterator it=it1l;it!=it1r;it++)
	{
		b.push_back(node(it->l,it->r,it->v));
	}
	int pos=l2;
	s.erase(it1l,it1r);
	for(set<node>::iterator it=itl;it!=itr;it++)
	{
		s.insert(node(pos,pos+it->r-it->l,it->v));
		pos+=it->r-it->l+1;
	}
	pos=l1;
	for(int i=0;i<b.size();i++)
	{
		s.insert(node(l+r-b[i].r,pos+l+r-b[i].l,b[i].v));
		pos+=it[r]-it[l]+1;
	}*/
}
void turn(int l,int r)
{
	set<node>::iterator itr=split(r+1),itl=split(l),l1=itl,r1=itr;
	//vector<node> b;
	int len=0;
	for(;itl!=itr;itl++)
	{
		a[++len].l=itl->l;
		a[len].r=itl->r;
		a[len].v=itl->v;
	}
	s.erase(l1,r1);
	for(int i=1;i<=len;i++)
	{
		s.insert(node(l+r-a[i].r,l+r-a[i].l,a[i].v));
	}
}
int main()
{
	n=read();m=read();
	for(int i=1;i<=n;i++)
	{
		int x;
		x=read();
		s.insert(node(i,i,x));
	}
	s.insert(node(n+1,n+1,0));
	for(int i=1;i<=m;i++)
	{
		int opt;
		cin>>opt;
		if(opt==1)
		{
			int x,y;
			x=read();y=read();
			cout<<query(x,y)<<endl;
		}
		if(opt==2)
		{
			int x,y;
			long long z;
			x=read();y=read();
			cin>>z;
			assign(x,y,z);
		}
		if(opt==3)
		{
			int x,y;
			long long z;
			x=read();y=read();
			cin>>z;
			change(x,y,z);
		}
		if(opt==4)
		{
			int x1,y1,x2,y2;
			x1=read();y1=read();x2=read();y2=read();
			rcopy(x1,y1,x2,y2);
		}
		if(opt==5)
		{
			int x1,y1,x2,y2;
			x1=read();y1=read();x2=read();y2=read();
			exchange(x1,y1,x2,y2);
		}
		if(opt==6)
		{
			int x,y;
			x=read();y=read();
			turn(x,y);
		}
	}
	for(set<node>::iterator it=s.begin();it!=s.end()&&it->r<=n;it++)
	{
        for(int i=it->l;i<=it->r;i++)
		{
			printf("%lld ",it->v);
		}
    }
	return 0;
}

改了14遍了,裂开哩

2022/10/19 21:58
加载中...