社区讨论

P5350求助珂朵莉树QAQ

P5350序列参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi7yepqg
此快照首次捕获于
2025/11/21 05:39
4 个月前
此快照最后确认于
2025/11/21 05:39
4 个月前
查看原帖
CPP
#include<stdio.h>
#include<set>
#include<vector>
using namespace std;

int n, m, mod;
struct Node {
	int l, r; mutable int v;
	Node(int L, int R = -1, int V = 0) : l(L), r(R), v(V) {}
	bool operator < (const Node &x) const { return l < x.l; }
};
set<Node> s;
#define IT set<Node>::iterator
inline IT split(int pos) {
	IT it = s.lower_bound(Node(pos));
	if(it != s.end() && it->l == pos) return it;
	int l = (--it)->l, r = it->r, v = it->v;
	s.erase(it);
	s.insert(Node(l, pos - 1, v));
	return s.insert(Node(pos, r, v)).first;
}
inline void assign(int l, int r, int v) {
	IT itr = split(r + 1), itl = split(l);
	s.erase(itl, itr); s.insert(Node(l, r, v));
}
inline int sum(int l, int r) {
	IT itr = split(r + 1), itl = split(l);
	int ret = 0;
	for(;itl != itr;itl++) {
		ret = (ret + itl->v * (itl->r - itl->l + 1)) % mod;
	}
	return ret;	
}
inline void add(int l, int r, int v) {
	IT itr = split(r + 1), itl = split(l);
	for(;itl != itr;itl++) {
		itl->v = (itl->v + v) % mod;
	}
}
inline void copy(int fl, int fr, int l, int r) {
	IT itr = split(r + 1), itl = split(l);
	IT itfr = split(fr + 1), itfl = split(fl);
	vector<Node> v;
	for(;itfl != itfr;itfl++) v.push_back(*itfl);
	s.erase(itl, itr);
	int d = l - fl;
	for(int i = 0;i < v.size();i++) {
		Node now = v[i];
		s.insert(Node(now.l + d, now.r + d, now.v));
	}	
}
inline void swap(int &a, int &b) { a ^= b, b ^= a, a ^= b; }
inline void replace(int fl, int fr, int l, int r) {
	if(l > fl) { swap(fl, l); swap(fr, r); }
	IT itr = split(r + 1), itl = split(l);
	IT itfr = split(fr + 1), itfl = split(fl);
	vector<Node> a, b;
	for(IT it = itfl;it != itfr;it++) a.push_back(*it);
	for(IT it = itl;it != itr;it++) b.push_back(*it);
	int d = l - fl;
	s.erase(itl, itr); s.erase(itfl, itfr);
	for(int i = 0;i < a.size();i++) { // [l, r]
		Node now = a[i];
		s.insert(Node(now.l + d, now.r + d, now.v));
	}
	for(int i = 0;i < b.size();i++) { // [fl, fr]
		Node now = b[i];
		s.insert(Node(now.l - d, now.r - d, now.v));
	}
}	
inline void reverse(int l, int r) {
	IT itr = split(r + 1), itl = split(l);
	vector<Node> v;
	for(;itl != itr;itl++) {
		v.push_back(*itl);
	}
	int d = r - l;
	for(int i = v.size() - 1;i >= 0;i--) {
		Node now = v[i];
		s.insert(Node(now.l - d, now.r - d, now.v));
	}
}
inline void print() {
	for(IT it = s.begin();it != s.end();it++) {
		Node now = *it;
		for(int i = 0;i < now.r - now.l + 1;i++) {
			printf("%d ", now.v);
		}
	}
}

int main(int argc, char** args) {
	int t = 0; mod = 1e9 + 7;
	scanf("%d %d", &n, &m);
	for(int i = 1;i <= n;i++) {
		scanf("%d", &t);
		s.insert(Node(i, i, t));
	}
	s.insert(Node(n + 1));
	int opt = 0, l = 0, r = 0, fl = 0, fr = 0, k = 0;
	for(int i = 1;i <= m;i++) {
		scanf("%d %d %d", &opt, &l, &r);
		if(opt == 2 || opt == 3) scanf("%d", &k);
		if(opt == 4 || opt == 5) scanf("%d %d", &fl, &fr);
		if(opt == 1) printf("%d\n", sum(l, r));
		if(opt == 2) assign(l, r, k);
		if(opt == 3) add(l, r, k);
		if(opt == 4) copy(l, r, fl, fr);
		if(opt == 5) replace(fl, fr, l, r);
		if(opt == 6) reverse(l, r);
	}
	print();
}

RE+TLE

回复

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

正在加载回复...