分块 WA 致 30pts 求助
查看原帖
分块 WA 致 30pts 求助
622263
guantianze楼主2022/11/12 09:09

rtrt

拿到题目之后首先想到分块, 复杂度可以接受就写了

最后不论结果的话跑的也是挺快的

问题是自己写了对拍 小规模的数据完全拍不出来(大抵拍了12h) 至少要上万才会拍出来错误

蒟蒻危亡, 赖诸位神犇助力

代码贴上

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define re register

const int INF = 0x3f3f3f3f;
using namespace std;

struct book{
	int wk, wg;
};

book b[800050];
int n, m;
int k[500][500];
int l[500];
int sq = 495;
int tot, ftot = 166 * 500;

int main(){
	freopen("2596.in", "r", stdin);
	freopen("2596.out", "w", stdout); 
	cin >> n >> m;
	tot = n + ftot - 1;
	for (int i = n; i >= 1; i--){
		int a;
		cin >> a;
		k[(i + ftot - 1) / sq + 1][(i + ftot - 1) % sq] = a;
		b[a].wk = (i + ftot - 1) / sq + 1;
		b[a].wg = (i + ftot - 1) % sq;
		l[(i + ftot - 1) / sq + 1]++;  
	}
	while (m--){
		string opt;
		cin >> opt;
		if (opt == "Top"){
			int s, x, y;
			cin >> s;
			x = b[s].wk; y = b[s].wg; k[x][y] = 0; 
			l[x]--; tot++;
			x = tot / sq + 1; y = tot % sq;
			k[x][y] = s;
			b[s].wg = y; b[s].wk = x;
			l[x]++;
		}
		if (opt == "Bottom"){
			int s, x, y;
			cin >> s;
			x = b[s].wk; y = b[s].wg; k[x][y] = 0;
			l[x]--; ftot--;
			x = ftot / sq + 1; y = ftot % sq;
			k[x][y] = s;
			b[s].wg = y; b[s].wk = x;
			l[x]++;
		}
		if (opt == "Insert"){
			int s, t;
			cin >> s >> t;
			if (t == -1){
				int xs = b[s].wk, ys = b[s].wg;
				int flag = 0;
				for (re int i = ys + 1; i < sq; i++)
					if (k[xs][i] != 0){
						swap(b[s], b[k[xs][i]]);
						swap(k[xs][ys], k[xs][i]);
						flag = 1;
						break;
					}
				if (flag == 0)
					for (re int j = xs + 1; j <= sq; j++)
						if (l[j] != 0)
							for (re int i = 0; i < sq; i++)
								if (k[j][i] != 0){
									swap(b[s], b[k[j][i]]);
									swap(k[xs][ys], k[j][i]);
									break;
								}
			}
			if (t == 1){
				int xs = b[s].wk, ys = b[s].wg;
				int flag = 0;
				for (re int i = ys - 1; i >= 0; i--){
//					cout << k[xs][i] << " "; 
					if (k[xs][i] != 0){
						swap(b[s], b[k[xs][i]]);
						swap(k[xs][ys], k[xs][i]);
						flag = 1;
						break;
					}
				}
//				cout << endl;
				if (flag == 0)
					for (re int j = xs - 1; j >= 1; j--)
						if (l[j] != 0)
							for (re int i = sq - 1; i >= 0; i--)
								if (k[j][i] != 0){
									swap(b[s], b[k[j][i]]);
									swap(k[xs][ys], k[j][i]);
									break;
								}
			}
		}
		if (opt == "Ask"){
			int s, ans = 0;
			cin >> s;
			int xs = b[s].wk, ys = b[s].wg;
			for (re int i = ys + 1; i < sq; i++){
				if (k[xs][i] != 0)
					ans++;
			}
			for (re int i = xs + 1; i <= sq; i++)
				ans += l[i];
			cout << ans << endl;
		}
		if (opt == "Query"){
			int s, xs;
			cin >> s;
			for (re int i = sq; i > 0; i--){
				s -= l[i];
				if (s <= 0){
					s += l[i];
					xs = i;
					break;
				}
			}
			for (re int i = sq - 1; i >= 0; i--){
				if (k[xs][i] != 0) {
					s--;
					if (s == 0){
						cout << k[xs][i] << endl;
						break;
					}
				}
			}
		}
//		for (int i = 1; i <= sq; i++)
//			if (l[i] != 0)
//				for (int j = 0; j < sq; j++)
//					if (k[i][j] != 0) cout << k[i][j] << " ";
//		cout << endl;
	}	
	return 0;
}
2022/11/12 09:09
加载中...