萌新ODTOLE求助qwq
查看原帖
萌新ODTOLE求助qwq
450700
hello_world_djh楼主2022/8/2 16:25

T1~T3:WA T4~T5:OLE T6~T10:TLE 样例能过

#include <bits/stdc++.h>
#define It set<ODT>::iterator
#define swap my_swap

inline void my_swap(long long &x, long long &y) {
	x ^= y ^= x ^= y;
	return;
}

using namespace std;

typedef long long ll;

const int N = 3e5 + 10;
const int MOD = 1e9 + 7;

struct ODT {
	ll l, r;
	mutable ll val;
	ODT(ll _l = 0, ll _r = 0, ll _val = 0):l(_l), r(_r), val(_val) {return;}
	bool operator < (const ODT &x)const {
		return l < x.l;
	}
} a[N], b[N];
void clear(ODT c[]) {
	
	return;
}
set<ODT> tree;

inline It split(ll x) {
	It it = tree.lower_bound(ODT(x));
	if (it != tree.end() && it->l == x) return it;
	it--;
	ll l = it->l, r = it->r, val = it->val;
	tree.erase(it);
	tree.insert(ODT(l, x - 1, val));
	return tree.insert(ODT(x, r, val)).first;
}

inline void assign(ll l, ll r, ll val) {
	It itr = split(r + 1), itl = split(l);
	tree.erase(itl,itr);
	tree.insert(ODT(l,r,val));
	return;
}

inline ll query(ll l, ll r) {
	It itr = split(r + 1), itl = split(l);
	ll sum = 0;
	for (It it = itl; it != itr; it++) {
		sum = (sum % MOD + (it->val % MOD * (it->r - it->l + 1) % MOD) % MOD) % MOD;
	}
	return sum;
}

inline void add(ll l, ll r, ll val) {
	It itr = split(r + 1), itl = split(l);
	for (It it = itl; it != itr; it++) {
		it->val = (it->val % MOD + val % MOD) % MOD;
	}
	return;
}

inline void Copy(ll l1, ll r1, ll l2, ll r2) {
	It itr1 = split(r1 + 1), itl1 = split(l1);It itr2 = split(r2 + 1), itl2 = split(l2);
	tree.erase(itl2, itr2);
	for (It it = itl1; it != itr1; it++)
		tree.insert(ODT(it->l - l1 + l2, it->r - l1 + l2, it->val));
	return;
}

inline void SWAP1(ll l1, ll r1, ll l2, ll r2) {
	It itr1 = split(r1 + 1);
	It itl1 = split(l1);
	int c = l2 - l1;
	int cnt1 = 0, cnt2 = 0;
	for (It it = itl1; it != itr1; it++) {
		a[++cnt1] = ODT(it->l, it->r, it->val);
	}
	tree.erase(itl1, itr1);
	It itr2 = split(r2 + 1);
	It itl2 = split(l2);
	for (It it = itl2; it != itr2; it++) {
		b[++cnt2] = ODT(it->l, it->r, it->val);
	}
	tree.erase(itl2, itr2);
	for (int i = 1; i <= cnt2; i++)
		tree.insert(ODT(b[i].l - c, b[i].r - c, b[i].val));
	for (int i = 1; i <= cnt1; i++)
		tree.insert(ODT(a[i].l + c, a[i].r + c, a[i].val));
	for (int i = 1; i <= cnt1; i++)
		a[i] = ODT();
	for (int i = 1; i <= cnt2; i++)
		b[i] = ODT();
	return;
}

inline void reverse(ll l, ll r) {
	int cnt = 0;
	It itr = split(r + 1), itl = split(l);
	for (It it = itl; it != itr; it++) {
		a[++cnt] = ODT(it->l, it->r, it->val);
	}
	tree.erase(itl, itr);
	for (int i = 1; i <= cnt; i++)
		tree.insert(ODT(r + l - a[i].r, r + l - a[i].l, a[i].val));
	for (int i = 1; i <= cnt; i++)
		a[i] = ODT();
	return;
}

int n, m;
ll x;

int main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m >> x;
	ll lst = x;
	int lstl = 1;
	for (int i = 2; i <= n; i++) {
		cin >> x;
		if (x != lst) {
			tree.insert(ODT(lstl, i - 1, lst));
			lst = x;
			lstl = i;
		}
	}
	tree.insert(ODT(lstl, n, lst));
	for (int i = 1,op; i <= m; i++) {
		ll l, r, l1, r1;
		cin >> op >> l >> r;
		if (l > r)
			swap(l, r);
		switch (op) {
			case 1: {
				cout << query(l, r) << endl;
				break;
			}
			case 2: {
				cin >> l1;
				assign(l, r, l1);
				break;
			}
			case 3: {
				cin >> l1;
				add(l, r, l1);
				break;
			}
			case 4: {
				cin >> l1 >> r1;
				if (l1 > r1)
					swap(l1, r1);
				Copy(l, r, l1, r1);
				break;
			}
			case 5: {
				cin >> l1 >> r1;
				if (l1 > r1)
					swap(l1, r1);
				if (l > l1) {
					swap(l, l1);
					swap(r, r1);
				}
				SWAP1(l, r, l1, r1);
				break;
			}
			default: {
				reverse(l, r);
				break;
			}
		}
	}
	for (It it = tree.begin(); it != tree.end(); it++) {
		for (int i = it->l; i <= it->r; i++)
			cout << it->val % MOD << ' ';
	}
	return 0;
}
2022/8/2 16:25
加载中...