求调
  • 板块学术版
  • 楼主xz001
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/3 09:46
  • 上次更新2023/11/2 16:23:48
查看原帖
求调
674967
xz001楼主2023/10/3 09:46
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int l, r;
	mutable int v;
	node (int ll, int rr = 0, int vv = 0) {
		l = ll, r = rr, v = vv;
	} 
	bool operator < (const node x) const {
		return l < x.l;
	}
};
vector<node>v;
inline bool cmp(node a, node b) {
	return a.v < b.v;
}
set <node> s;
inline set<node>::iterator split (int pos) {
	set<node>::iterator it = s.lower_bound(node(pos));
	if (it != s.end() && it->l == pos) {
		return it;
	}
	-- it;
	if (it->r < pos) return s.end();
	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) {
    set<node>::iterator rr = split(r + 1), ll = split(l);
	s.erase(ll, rr);
	s.insert({l, r, v});
	return;   	
}
inline void add (int l, int r, int v) {
	set<node>::iterator rr = split(r + 1), ll = split(l);
	for (; ll != rr; ++ ll) ll->v += v;
	return;
}
inline int sum (int l, int r, int mod) {
	set<node>::iterator rr = split(r + 1), ll = split(l);
	int ans = 0;
	for (set<node>::iterator i = ll; i != rr; ++ i) {
		ans += i->v * (i->r - i->l + 1);
		ans %= mod;
	}
	return ans;
}
inline void copy(int l1, int r1, int l2, int r2) {
	set<node>::iterator rr, ll;
	set<node>::iterator rrr, lll;
	if (l2 > l1) {
		rrr = split(r2 + 1), lll = split(l2);
		rr = split(r1 + 1), ll = split(l1);
	}else{
		rr = split(r1 + 1), ll = split(l1);
		rrr = split(r2 + 1), lll = split(l2);
	}
	s.erase(lll, rrr);
	v.clear();
	for (set<node>::iterator i = ll; i != s.end() && i != rr; ++ i) {
		v.push_back(*i);
	}
	for (int i = 0; i < (int)v.size(); ++ i) {
		s.insert(node(l2 + v[i].l - l1, l2 + v[i].r - l1, v[i].v));
	}
	return;
}
inline void swp(int l1, int r1, int l2, int r2) {
	set<node>::iterator rr, ll;
	if (l1 > l2) {
		split(r1 + 1), split(l1);
		rr = split(r2 + 1), ll = split(l2);
	}else{
		rr = split(r2 + 1), ll = split(l2);
		split(r1 + 1), split(l1);
	}
	v.clear();
	for (set<node>::iterator i = ll; i != rr; ++ i) {
		v.push_back(*i);
	}
	copy(l1, r1, l2, r2);
	s.erase(s.lower_bound({l1, l1, 0}), s.upper_bound({r1, r1, 0}));
	for (int i = 0; i < (int)v.size(); ++ i) {
		s.insert(node(l1 + v[i].l - l2, l1 + v[i].r - l2, v[i].v));
	}
	return;
}
inline void rever(int l, int r) {
	set<node>::iterator rr = split(r + 1), ll = split(l);
	v.clear();
	for (set<node>::iterator i = ll; i != rr; ++ i) v.push_back(*i);
	s.erase(ll, rr);
	for (int i = 0; i < (int)v.size(); ++ i) {
		s.insert(node(r - v[i].l + l, r - v[i].r + l, v[i].v));
	} 
	return;
} 
int n, m; 
signed main() {
	scanf("%lld%lld", &n, &m);
	for (int i = 1, a; i <= n; ++ i) {
		scanf("%lld", &a);
		s.insert(node(i, i, a));
	}
	while (m -- ) {
		int op;
		scanf("%lld", &op);
		if (op == 1) {
			int l, r;
			scanf("%lld%lld", &l, &r);
			printf("%lld\n", sum(l, r, 1000000007));
		} else if (op == 2) {
			int l, r, v;
			scanf("%lld%lld%lld", &l, &r, &v);
			assign(l, r, v);
		} else if (op == 3) {
			int l, r, v;
			scanf("%lld%lld%lld", &l, &r, &v);
			add(l, r, v);
		} else if (op == 4) {
			int l1, r1, l2, r2;
			scanf("%lld%lld%lld%lld", &l1, &r1, &l2, &r2);
			copy(l1, r1, l2, r2);
		} else if (op == 5) {
			int l1, r1, l2, r2;
			scanf("%lld%lld%lld%lld", &l1, &r1, &l2, &r2);
			swp(l1, r1, l2, r2);
		} else {
			int l, r;
			scanf("%lld%lld", &l, &r);
			rever(l, r);
		}
	}
	for (int i = 1; i <= n; ++ i) {
		printf("%lld ", sum(i, i, 1000000007));
	}
	return 0;
}

一直 TLE 伴着 RE 伴着 MLE,求助大佬调。

2023/10/3 09:46
加载中...