喵了个喵的(70pts 求调)
查看原帖
喵了个喵的(70pts 求调)
637796
Xy_top楼主2023/10/30 19:05
#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (int i = (a); i <= (b); i ++)
#define foR(i, a, b) for (int i = (a); i >= (b); i --)
using namespace std;
int T, n, m, k;
int sp, sum;
int a[2000005], p[1000], bel[1000];//p,0:没有,1:栈顶,2:栈底;bel,属于哪个栈
int op[4000005], l[4000005], r[4000005];
int zhan[305][3];//每个栈内的信息
deque <int> kong;//没满的栈
void clear () {
	For (i, 1, 2 * n) p[i] = bel[i] = 0;
	For (i, 1, n) zhan[i][1] = zhan[i][2] = 0;
	sum = 0;
	kong.clear ();
}
void print () {
	cout << sum << '\n';
	For (i, 1, sum) {
		if (op[i] == 1) cout << 1 << ' ' << l[i] << '\n';
		else cout << 2 << ' ' << l[i] << ' ' << r[i] << '\n';
	}
}
void fang (int x) {
	op[++ sum] = 1;
	l[sum] = x;
}
void qing (int x, int y) {
	op[++ sum] = 2;
	l[sum] = x;
	r[sum] = y;
}
bool jia (int x) {
	while (kong.size () && zhan[kong.back ()][1]) kong.pop_back ();
	if (kong.empty () ) return 0;
	fang (kong.back () );
	bel[x] = kong.back ();
//	cout << 1 << ' ' << kong.back () << '\n';
	if (zhan[bel[x] ][2]) {
		zhan[bel[x] ][1] = x;
		p[x] = 1;
		kong.pop_back ();
	} else if (!zhan[bel[x] ][1]) {
		zhan[bel[x] ][2] = x;
		p[x] = 2;
	}
	return 1;
}
void shan (int x) {//已知某个元素在栈顶或栈底且机动栈为空的情况下删除这个元素 
	if (p[x] == 1) {
		fang (bel[x]);
//		cout << 1 << ' ' << bel[a[i] ] << '\n';
		zhan[bel[x] ][1] = 0;
		p[x] = 0;
		kong.push_back (bel[x]);
		bel[x] = 0;
	} else {
		fang (sp);
		qing (bel[x], sp);
//		cout << 1 << ' ' << sp << '\n' << 2 << ' ' << bel[a[i] ] << ' ' << sp << '\n';
		zhan[bel[x] ][2] = zhan[bel[x] ][1];
		zhan[bel[x] ][1] = 0;
		p[x] = 0;
		p[zhan[bel[x] ][2] ] = 2;
		kong.push_back (bel[x]);
		bel[x] = 0;
	}
}
int get (int l, int r, int c) {
	int ret = 0;
	For (i, l, r) if (a[i] == c) ++ ret;
	return ret;
}
void solve () {
	cin >> n >> m >> k;
	sp = n;
	clear ();
	foR (i, n - 1, 1) kong.push_back (i);
	For (i, 1, m) cin >> a[i];
	For (i, 1, m) {
		if (p[a[i] ]) shan (a[i]);
		else {
			if (jia (a[i]) ) continue;
			int j = i + 1;
			while (p[a[j] ] != 2) ++ j;
			int x = zhan[bel[a[j] ] ][1], y = a[i];
			int cntx = get (i, j, x), cnty = get (i, j, y);
			//cntx % 2 == 0 && cnty % 2 == 1
			For (k, i, j - 1) {
				if (a[k] == y) {
					if (cntx & 1) fang (sp);
					else fang (bel[a[j] ]);
				} else if (a[k] == x) {
					if (cntx & 1) fang (bel[a[j] ]);
					else fang (sp);
				} else if (p[a[k] ]) shan (a[k]);
				else jia (a[k]);
			}
			if (cntx & 1) {
				fang (bel[a[j] ]);
				zhan[bel[a[j] ] ][1] = zhan[bel[a[j] ] ][2] = 0;
				kong.push_back (sp);
				if (cnty & 1) {
					p[y] = 2;
					bel[y] = sp;
					zhan[sp][2] = y;
				}
				sp = bel[a[j] ];
				p[a[j] ] = bel[a[j] ] = p[x] = bel[x] = 0;
			} else {
				fang (sp);
				qing (bel[a[j] ], sp);
				zhan[bel[a[j] ] ][2] = x;
				p[x] = 2;
				if (cnty & 1) {
					zhan[bel[a[j] ] ][1] = y;
					p[y] = 1;
					bel[y] = bel[a[j] ];
				} else {
					zhan[bel[a[j] ] ][1] = 0;
					kong.push_back (bel[a[j] ]);
				}
				bel[a[j] ] = p[a[j] ] = 0;
			}
			i = j;
			//更新 p,bel,zhan,op,l,r
		}
//		print_ ();
	}
	print ();
}
signed main () {
	int _ = 1;
	cin >> _;
	while (_ --) {
		solve ();
		cout << '\n';
	}
	return 0;
}
2023/10/30 19:05
加载中...