全RE求助┭┮﹏┭┮
  • 板块P5350 序列
  • 楼主tjtdrxxz
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/12 18:31
  • 上次更新2024/6/12 21:23:45
查看原帖
全RE求助┭┮﹏┭┮
1066818
tjtdrxxz楼主2024/6/12 18:31

code :

# include <bits/stdc++.h>
# pragma pack ()
using namespace std;

inline int read ()
{
	register char in = getchar (), f = 0; register int t = 0;
	for (; !isdigit (in); in = getchar ()) if (!(in xor 45)) f = 1;
	for (; in >= '0' and in <= '9'; in = getchar ())
	 t = (t << 1) + (t << 3) + (in ^ 48);
	return f ? -t : t;
}

inline void write (register long long x)
{
	static int t[25]; register int tp = 0;
	if (x == 0) return (void) (puts ("0"));
	else if (x < 0) putchar ('-'), x = -x;
	while (x) t[++tp] = x % 10, x /= 10;
	while (tp) putchar (t[tp--] + '0');
	puts ("");
}

# define stdi stdin
# define stdo stdout

const int mod = 1e9 + 7;

struct node
{
	mutable int l, r, v;
	bool operator < (const node &other) const { return l < other.l; }
	node (int l, int r = 0, int v = 0) : l (l), r (r), v (v) {}
};
set <node> tree;

struct NUM
{
	int l, r, v;
}q[100012], q1[100012], q2[100012];
int len, len1, len2;

//分裂
inline set <node> :: iterator split (int pos)
{
	set <node> :: iterator it = tree.lower_bound (node (pos));
	if (it != tree.end () and it -> l == pos) return it; it --;
	if (it -> r < pos) return tree.end ();
	register const int l = it -> l;
	register const int r = it -> r;
	register const int v = it -> v;
	tree.erase (it);
	tree.insert (node (l, pos - 1, v));
	return tree.insert (node (pos, r, v)).first;
}

//区间和
long long sum (int l, int r)
{
	register long long ret = 0; set <node> :: iterator rr = split (r + 1), ll = split (l), it;
	for (it = ll; it != rr; it ++) ret = (ret + (it -> r - it -> l + 1) * it -> v) % mod;
	return ret;
}

//区间覆盖
void cover (int l, int r, int k)
{
	set <node> :: iterator rr = split (r + 1), ll = split (l);
	tree.erase (ll, rr); tree.insert (node (l, r, k));
}

//区间加
void add (int l, int r, int k)
{
	set <node> :: iterator rr = split (r + 1), ll = split (l), it;
	for (it = ll; it != rr; it ++) it -> v = (it -> v + k) % mod;
}

//复制
void copy (int l1, int r1, int l2, int r2)
{
	set <node> :: iterator rr1 = split (r1 + 1), ll1 = split (l1);
	set <node> :: iterator rr2 = split (r2 + 1), ll2 = split (l2);
	set <node> :: iterator it;
	len = 0;
	for (it = ll1; it != rr1; it ++)
	{
		q[++len].l = it -> l;
		q[len].r = it -> r;
		q[len].v = it -> v;
	}
	int l, r, v;
	tree.erase (ll2, rr2);
	for (int i = 1; i <= len; i ++)
	{
		l = q[i].l - l1 + l2;
		r = q[i].r - l1 + l2;
		v = q[i].v;
		tree.insert (node (l, r, v));
	}
}

//交换
void exchange (int l1, int r1, int l2, int r2)
{
	set <node> :: iterator rr1 = split (r1 + 1), ll1 = split (l1);
	set <node> :: iterator rr2 = split (r2 + 1), ll2 = split (l2);
	set <node> :: iterator it;
	int l, r, v;
	len1 = 0; for (it = ll1; it != rr1; it ++) q1[++ len1].l = it -> l, q1[len1].r = it -> r, q1[len1].v = it -> v;
	len2 = 0; for (it = ll2; it != rr2; it ++) q2[++ len2].l = it -> l, q2[len2].r = it -> r, q2[len2].v = it -> v;
	tree.erase (ll1, rr1); for (int i = 1; i <= len2; i ++) tree.insert (node (q2[i].l - l2 + l1, q2[i].r - l2 + l1, q2[i].v));
	tree.erase (ll2, rr2); for (int i = 1; i <= len1; i ++) tree.insert (node (q1[i].l - l1 + l2, q1[i].r - l1 + l2, q1[i].v));
}

//翻转
void flip (register int l, register int r)
{
	set <node> :: iterator rr = split (r + 1), ll = split (l), it;
	len = 0;
	for (it = ll; it != rr; it ++)
	{
		q[++len].l = it -> l;
		q[len].r = it -> r;
		q[len].v = it -> v;
	}
	tree.erase (ll, rr);
	for (int i = 1; i <= len; i ++) tree.insert (node (l + r - q[i].r, l + r - q[i].l, q[i].v));
}
int n = read (), m = read ();
int main()
{
	setvbuf (stdi, (char*) calloc (1 << 20, sizeof (char)), _IOFBF, 1 << 20);
	setvbuf (stdo, (char*) calloc (1 << 20, sizeof (char)), _IOFBF, 1 << 20);
	for (register int i = 1; i <= n; i ++) tree.insert (node (i, i, read ()));
	for (register int i = 1; i <= m; i ++)
	{
		register int op = read (), l, r, l1, r1, l2, r2, v;
		len = 0;
		len1 = 0;
		len2 = 0;
		if (op == 1)
		{
			l = read (), r = read ();
			write (sum (l, r));
		}
		if (op == 2)
		{
			l = read (), r = read (), v = read ();
			cover (l, r, v);
		}
		if (op == 3)
		{
			l = read (), r = read (), v = read ();
			add (l, r, v);
		}
		if (op == 4)
		{
			l1 = read (), r1 = read ();
			l2 = read (), r2 = read ();
			copy (l1, r1, l2, r2);
		}
		if (op == 5)
		{
			l1 = read (), r1 = read ();
			l2 = read (), r2 = read ();
			exchange (l1, r1, l2, r2);
		}
		if (op == 6)
		{
			l = read (), r = read ();
			flip (l, r);
		}
	}
	set <node> :: iterator it, ll = tree.begin (), rr = tree.end ();
	for (it = ll; it != rr; it ++)
	{
		for (int j = it -> l; j <= it -> r; j ++)
		 printf("%d ",it -> v);
	}puts("");
}

@only_one

2024/6/12 18:31
加载中...