样例坠机了求调QwQ
查看原帖
样例坠机了求调QwQ
1066818
tjtdrxxz楼主2024/10/18 23:03

code:

# include "bits/stdc++.h"
# define int long long
# define size chtholly
using namespace std;
namespace trees
{
	template <const int N>
	class treap
	{
		private :
			struct node
			{
				int weight, size;
				int lef, rig;
				int val, sum;
				int tag, lazy, add, cov;
				node (int val = 0, int sum = 0, int size = 0, int tag = 0, int weight = 0, int lef = 0, int rig = 0, int cov = 0) :
					val (val), sum (sum), size (size), tag (tag), weight (weight), lef (lef), rig (rig), cov (cov) {}
			};
			node tree[N * 20 + 5];
			int root = 0, size = 0, cnt = 0;
			int lson (int ind)
			{
				return tree[ind].lef;
			}
			int rson (int ind)
			{
				return tree[ind].rig;
			}
			int make (int v = 0)
			{
				tree[++ size] = node (v, v, 1, 0, rand (), 0, 0);
				return size;
			}
			int copy (int ind)
			{
				int tmp = make ();
				tree[tmp] = tree[ind];
				return tmp;
			}
			void push_up (int ind)
			{
				tree[ind].size = tree[lson (ind)].size + tree[rson (ind)].size + 1;
				tree[ind].sum = tree[lson (ind)].sum + tree[rson (ind)].sum + tree[ind].val;
			}
			void push_down (int ind)
			{
				if (!tree[ind].tag and !tree[ind].cov and !tree[ind].add) return;
				if (lson (ind)) tree[ind].lef = copy (lson (ind));
				if (rson (ind)) tree[ind].rig = copy (rson (ind));
				if (tree[ind].tag)
				{
					if (lson (ind)) tree[ind].lef = copy (tree[ind].lef), swap (tree[lson (ind)].lef, tree[lson (ind)].rig);
					if (rson (ind)) tree[ind].rig = copy (tree[ind].rig), swap (tree[rson (ind)].lef, tree[rson (ind)].rig);
					if (lson (ind)) tree[lson (ind)].tag ^= 1;
					if (rson (ind)) tree[rson (ind)].tag ^= 1;
					tree[ind].tag = 0;
				}
				if (tree[ind].cov)
				{
					if (lson (ind))
					{
						tree[lson (ind)].sum = tree[lson (ind)].size * tree[ind].lazy;
						tree[lson (ind)].val = tree[ind].lazy;
					}
					if (rson (ind))
					{
						tree[rson (ind)].sum = tree[rson (ind)].size * tree[ind].lazy;
						tree[rson (ind)].val = tree[ind].lazy;
					}
					tree[lson (ind)].add = tree[rson (ind)].add = 0;
					if (lson (ind)) tree[lson (ind)].lazy = tree[ind].lazy, tree[lson (ind)].cov = 1;
					if (rson (ind)) tree[rson (ind)].lazy = tree[ind].lazy, tree[rson (ind)].cov = 1;
					tree[ind].cov = 0;
				}
				if (tree[ind].add)
				{
					if (lson (ind))
					{
						tree[lson (ind)].sum += tree[lson (ind)].size * tree[ind].add;
						tree[lson (ind)].val += tree[ind].add;
						tree[lson (ind)].add += tree[ind].add;
					}
					if (rson (ind))
					{
						tree[rson (ind)].sum += tree[rson (ind)].size * tree[ind].add;
						tree[rson (ind)].val += tree[ind].add;
						tree[rson (ind)].add += tree[ind].add;
					}
					tree[ind].add = 0;
				}
			}
			void push (int ind)
			{
				push_down (ind);
				if (lson (ind))
				{
					push (ind);
				}
				a[++ cnt] = tree[ind].val;
				if (rson (ind))
				{
					push (ind);
				}
			}
			void split (int ind, int mid, int &x, int &y)
			{
				if (!ind)
				{
					x = y = 0;
					return;
				}
				push_down (ind);
				if (tree[lson (ind)].size < mid)
				{
					x = copy (ind);
					split (tree[x].rig, mid - tree[lson (ind)].size - 1, tree[x].rig, y);
					push_up (x);
				}
				else
				{
					y = copy (ind);
					split (tree[y].lef, mid, x, tree[y].lef);
					push_up (y);
				}
			}
			int merge (int x, int y)
			{
				if (!x or !y) return x | y;
				if (tree[x].weight < tree[y].weight)
				{
					push_down (x);
					x = copy (x);
					tree[x].rig = merge (tree[x].rig, y);
					push_up (x);
					return x;
				}
				else
				{
					push_down (y);
					y = copy (y);
					tree[y].lef = merge (x, tree[y].lef);
					push_up (y);
					return y;
				}
			}
			int a[N];
			int build (int l, int r)
			{
				if (l > r) return 0;
				int k = make (a[l]);
				int mid = l + r >> 1;
				tree[k].lef = build (l, mid - 1);
				tree[k].rig = build (mid + 1, r);
				push_up (k);
				return k;
			}
			void print_in (int ind)
			{
				push_down (ind);
				if (lson (ind)) print_in (lson (ind));
				cout << tree[ind].val << ' ';
				if (rson (ind)) print_in (rson (ind));
			}
		public :
			void insert (int x)
			{
				root = merge (root, make (x));
			}
			void del (int a)
			{
				int x, y, z;
				split (root, a, x, z);
				split (x, a - 1, x, y);
				root = merge (x, z);
			}
			void reverse (int l, int r)
			{
				int x = 0, y = 0, z = 0;
				split (root, r, x, z);
				split (x, l - 1, x, y);
				y = copy (y);
				tree[y].tag ^= 1;
				swap (tree[y].lef, tree[y].rig);
				root = merge (merge (x, y), z);
			}
			void amend (int l, int r, int v)
			{
				int x = 0, y = 0, z = 0;
				split (root, r, x, z);
				split (x, l - 1, x, y);
				y = copy (y);
				tree[y].sum += tree[y].size * v;
				tree[y].val += v;
				tree[y].add += v;
				root = merge (merge (x, y), z);
			}
			void change (int l, int r, int v)
			{
				int x = 0, y = 0, z = 0;
				split (root, r, x, z);
				split (x, l - 1, x, y);
				y = copy (y);
				tree[y].sum = tree[y].size * v;
				tree[y].cov = 1;
				tree[y].val = v;
				tree[y].lazy = v;
				tree[y].add = 0;
				root = merge (merge (x, y), z);
			}
			int sum (int l, int r)
			{
				int x = 0, y = 0, z = 0;
				split (root, r, x, z);
				split (x, l - 1, x, y);
				int ret = tree[y].sum;
				root = merge (merge (x, y), z);
				return ret;
			}
			void copy_all (int l1, int r1, int l2, int r2)
			{
				int _1, _2, _3, _4, _5;
				bool check = 1;
				if (r1 > r2)
				{
					swap (l1, l2);
					swap (r1, r2);
					check = 0;
				}
				split (root, r2, _1, _5);
				split (_1, l2 - 1, _1, _4);
				split (_1, r1, _1, _3);
				split (_1, l1 - 1, _1, _2);
				if (check)
				{
					root = merge (_1, merge (_2, merge (_3, merge (_2, _5))));
				}
				else
				{
					root = merge (_1, merge (_4, merge (_3, merge (_4, _5))));
				}
			}
			void swap_all (int l1, int r1, int l2, int r2)
			{
				int _1, _2, _3, _4, _5;
				if (r1 > r2)
				{
					swap (l1, l2);
					swap (r1, r2);
				}
				split (root, r1, _1, _5), split (_1, l2 - 1, _1, _4);
				split (_1, r1, _1, _3), split (_1, l1 - 1, _2, _2);
				root = merge (_1, merge (_4, merge (_3, merge (_2, _5))));
			}
			void rebuild (int n)
			{
				cnt = 0;
				push (root);
				root = size = 0;
				root = build (1, n);
			}
			bool can ()
			{
				return size >= 3600000;
			}
			void print ()
			{
				print_in (root);
			}
	};
}
using namespace trees;
treap <200012> tree;
int n, m, a[200012];
int last = 0;
signed main ()
{
	ios :: sync_with_stdio (0);
	cin.tie (0), cout.tie (0);
	cin >> n >> m;
	for (int i = 1; i <= n; i ++)
	{
		cin >> a[i];
		tree.insert (a[i]);
	}
	for (int i = 1; i <= m; i ++)
	{
		int op, l, r, k, l1, r1, l2, r2;
		cin >> op;
		if (op == 1)
		{
			cin >> l >> r;
			l ^= last, r ^= last;
//			cout << l << r << endl;
			cout << (last = tree.sum (l, r)) << endl;
		}
		if (op == 2)
		{
			cin >> l >> r >> k;
			l ^= last, r ^= last, k ^= last;
//			cout << l << r << endl;
			tree.change (l, r, k);
		}
		if (op == 3)
		{
			cin >> l >> r >> k;
			l ^= last, r ^= last, k ^= last;
//			cout << l << r << endl;
			tree.amend (l, r, k);
		}
		if (op == 4)
		{
			cin >> l1 >> r1 >> l2 >> r2;
			l1 ^= last, r1 ^= last, l2 ^= last, r2 ^= last;
			tree.copy_all (l1, r1, l2, r2);
		}
		if (op == 5)
		{
			cin >> l1 >> r1 >> l2 >> r2;
			l1 ^= last, r1 ^= last, l2 ^= last, r2 ^= last;
			tree.swap_all (l1, r1, l2, r2);
		}
		if (op == 6)
		{
			cin >> l >> r;
			l ^= last, r ^= last;
			tree.reverse (l, r);
		}
		if (tree.can ())
		{
			tree.rebuild (n);
		}
	}
	tree.print ();
}

似乎是 swap 的问题,但找不出哪里坠了。。。

2024/10/18 23:03
加载中...