社区讨论

ODT WA 60pts求调

P5350序列参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m23e3msv
此快照首次捕获于
2024/10/10 22:24
去年
此快照最后确认于
2025/11/04 17:28
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int n,m;
struct node{
	int l,r;
	mutable long long v;
	node(int l,int r,long long v):l(l),r(r),v(v){}
	bool operator<(const node&rhs)const{
		return l<rhs.l;
	}
};
set<node>s;
auto split(int pos){
	auto it=s.lower_bound(node(pos,0,0));
	if(it!=s.end()&&it->l==pos){
		return it;
	}
	it--;
	int l=it->l,r=it->r;
	long long v=it->v;
	s.erase(it);
	s.insert(node(l,pos-1,v));
	return s.insert(node(pos,r,v)).first;
}
long long getsum(int l,int r){
	auto en=split(r+1),bg=split(l);
	long long sum=0;
	for(auto it=bg;it!=en;it++){
		sum=(sum+(long long)(it->r-it->l+1)*it->v)%mod;
	}
	return sum;
}
void update(int l,int r,long long v){
	auto en=split(r+1),bg=split(l);
	s.erase(bg,en);
	s.insert(node(l,r,v));
}
void add(int l,int r,long long v){
	auto en=split(r+1),bg=split(l);
	for(auto it=bg;it!=en;it++){
		it->v=(it->v+v)%mod;
	}
}
void copy(int l1,int r1,int l2,int r2){
	vector<node>res;
	auto en1=split(r1+1),bg1=split(l1);
	int len=l2-l1;
	for(auto it=bg1;it!=en1;it++){
		res.push_back(node(it->l+len,it->r+len,it->v));
	}
	auto en2=split(r2+1),bg2=split(l2);
	s.erase(bg2,en2);
	for(auto i:res){
		s.insert(node(i.l,i.r,i.v));
	}
}
void swp(int l1,int r1,int l2,int r2){
	vector<node>res1,res2;
	auto en1=split(r1+1),bg1=split(l1);
	for(auto it=bg1;it!=en1;it++){
		res1.push_back(*it);
	}
	s.erase(bg1,en1);
	auto en2=split(r2+1),bg2=split(l2);
	for(auto it=bg2;it!=en2;it++){
		res2.push_back(*it);
	}
	s.erase(bg2,en2);
	for(auto i:res1){
		s.insert(node(i.l-l1+l2,i.r-l1+l2,i.v));
	}
	for(auto i:res2){
		s.insert(node(i.l-l2+l1,i.r-l2+l1,i.v));
	}
}
void turn(int l,int r){
	auto en=split(r+1),bg=split(l);
	auto zcy=bg,czx=en;
	vector<node>res;
	for(auto it=bg;it!=en;it++){
		res.push_back(node(l+r-it->r,l+r-it->l,it->v));
	}
	s.erase(zcy,czx);
	for(auto i:res){
		s.insert(node(i.l,i.r,i.v));
	}
}
void print(){
	for(auto it=s.begin();it!=s.end()&&it->r<=n;it++){
		int len=it->r-it->l+1;
		long long v=it->v%mod;
		while(len--){
			printf("%lld ",v);
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		long long x;
		scanf("%lld",&x);
		x%=mod;
		s.insert(node(i,i,x));
	}
	s.insert(node(n+1,n+1,0ll));
	while(m--){
		int opt,l1,r1,l2,r2;
		long long val;
		scanf("%d",&opt);
		if(opt==1){
			scanf("%d%d",&l1,&r1);
			if(l1>r1)swap(l1,r1);
			printf("%lld\n",getsum(l1,r1));
		}
		else if(opt==2){
			scanf("%d%d%lld",&l1,&r1,&val);
			val%=mod;
			if(l1>r1)swap(l1,r1);
			update(l1,r1,val);
		}
		else if(opt==3){
			scanf("%d%d%lld",&l1,&r1,&val);
			val%=mod;
			if(l1>r1)swap(l1,r1);
			add(l1,r1,val);
		}
		else if(opt==4){
			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(opt==5){
			scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
			if(l1>r1)swap(l1,r1);
			if(l2>r2)swap(l2,r2);
			swp(l1,r1,l2,r2);
		}
		else{
			scanf("%d%d",&l1,&r1);
			if(l1>r1)swap(l1,r1);
			turn(l1,r1);
		}
	}
	print();
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...