set存数据,为什么set插入的数据会和原始数据不一样
  • 板块P5350 序列
  • 楼主peoi
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/1/24 11:44
  • 上次更新2023/10/24 03:12:54
查看原帖
set存数据,为什么set插入的数据会和原始数据不一样
310774
peoi楼主2023/1/24 11:44

自测数据

10 1
1 9 1 9 8 1 0 1 1 4
4 1 5 6 10

代码:

#include<iostream>
#include<set>
#include<vector>
#define elif else if
#define ll long long
#define up(i,x,y) for (int (i)=(x);(i)<=(y);(i)++)
#define down(i,x,y) for (int (i)=(x);(i)>=(y);(i)--)
using namespace std;

#define dtype long long
struct node{
	const int l,r;
	mutable dtype v;
	bool operator<(const node &a) const{
		return l<a.l;
	}
};

int n;
const ll mod=1000000007;

set<node>cht;
vector<node>tmp;

auto split(int x){
	if (x>n) return cht.end();
	auto it= --cht.upper_bound({x,0,0});
	if (it->l==x) return it;
	int l=it->l,r=it->r;
	dtype v=it->v;
	cht.erase(it);
	cht.insert({l,x-1,v});
	return cht.insert({x,r,v}).first;
}

void assign(int l,int r,dtype v){
	auto itr=split(r+1),itl=split(l);
	cht.erase(itl,itr);
	cht.insert({l,r,v});
}

void add(int l,int r,dtype x){
	auto itr=split(r+1),itl=split(l);
	for(auto i=itl;i!=itr;i++) i->v=(i->v+x)%mod;;
}

dtype sum(int l,int r){
	dtype res=0;
	auto itr=split(r+1),itl=split(l);
	for(auto i=itl;i!=itr;i++) res=(res+(i->v)*(i->r-i->l+1))%mod;
	return res;
}

int q,op,a,b,x,y;
ll v;
int main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);
	cin>>n>>q;
	up(i,1,n){
		cin>>v;
		cht.insert({i,i,v});
	}
	while(q--){
		cin>>op>>a>>b;
		if (op==1) cout<<sum(a,b)<<"\n";
		elif (op==2){
			cin>>b;
			assign(a,b,b);
		}
		elif (op==3){
			cin>>v;
			add(a,b,v);
		}
		elif (op==4){
			cin>>x>>y;
			auto itr=split(y+1),itl=split(x);
			cht.erase(itl,itr);
			itr=split(b+1),itl=split(a);
			for (auto i=itl;i!=itr;i++) {
				node tmp={x+i->l-a,x+i->r-a,i->v};
				cout<<tmp.l<<" "<<tmp.r<<" "<<tmp.v<<endl;
				auto cc=cht.insert(tmp).first;
				cout<<cc->l<<" "<<cc->r<<" "<<cc->v<<endl;
			}
		}
		elif (op==5){
			cin>>x>>y;
			auto itr=split(b+1),itl=split(a);
			for (auto i=itl;i!=itr;i++) tmp.push_back({x+i->l-a,x+i->r-a,i->v});
			cht.erase(itl,itr);
			itr=split(y+1),itl=split(x);
			for (auto i=itl;i!=itr;i++) cht.insert({a+i->l-x,a+i->r-x,i->v});
			cht.erase(itl,itr);
			for (node u:tmp) cht.insert(u);
			tmp.clear();
		}else{
			auto itr=split(b+1),itl=split(a);
			for (auto i=itl;i!=itr;i++) tmp.push_back({a+b-i->l,a+b-i->r,i->v});
			cht.erase(itl,itr);
			for (node u:tmp) cht.insert(u);
			tmp.clear(); 
		}
	}
	for (node u:cht) up(i,u.l,u.r) cout<<u.v<<" ";
}
2023/1/24 11:44
加载中...