QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#227945#7579. Nonsense TimeGiga_Cronos#AC ✓7838ms3992kbC++232.4kb2023-10-28 09:59:082023-10-28 09:59:08

Judging History

你现在查看的是最新测评结果

  • [2023-10-28 09:59:08]
  • 评测
  • 测评结果:AC
  • 用时:7838ms
  • 内存:3992kb
  • [2023-10-28 09:59:08]
  • 提交

answer

/// UH Top
#include <bits/stdc++.h>
#define db(x)   cerr << #x << ':' << (x) << '\n';
#define all(v)  (v).begin(), (v).end()
#define allr(v) (v).rbegin(), (v).rend()
// #define int ll
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
// typedef __int128_t int128;
typedef pair<ll, ll> pii;
typedef pair<ld, ll> pdi;
typedef pair<ld, ld> pdd;
typedef pair<ld, pdd> pdp;
typedef pair<string, ll> psi;
typedef pair<ll, string> pls;
typedef pair<string, string> pss;
typedef pair<ll, pii> pip;
typedef pair<pii, pii> ppp;
typedef complex<ld> point;
typedef vector<point> polygon;
typedef vector<ll> vi;
typedef pair<point, int> ppi;
#define prec(n)                                                                \
	cout.precision(n);                                                         \
	cout << fixed
const ll mod = (1e9 + 7);
const ld eps = (1e-9);
const ll oo = (ll)(1e18 + 5);
#define pi   acos(-1)
#define MAXN (ll)(1e6 + 5)

int l[100];
int sz = 0;

int lis(vector<int> &a) {
	sz = 0;
	for (int i = 0; i < 100; i++)
		l[i] = 0;
	for (const int &x : a) {
		if (!x)
			continue;
		int p = lower_bound(l, l + sz, x) - l;
		if (p == sz) {
			l[sz] = x;
			sz++;
		} else {
			l[p] = x;
		}
	}
	return sz;
}

vector<int> tc;

void solve(vector<int> &p, vector<int> &k, vector<int> &ans, int l, int r,
           int vl, int vr) {
	// cout << l << ' ' << r << ' ' << vl << ' ' << vr << "\n";
    // cout.flush();
	int n = p.size();
	int mid = (l + r) / 2;
	for (int i = 0; i <= mid; i++)
		tc[k[i] - 1] = p[k[i] - 1];
	int v = lis(tc);
	for (int i = 0; i <= mid; i++)
		tc[k[i] - 1] = 0;
	ans[mid] = v;
	if (v == vl) {
		for (int i = l; i < mid; i++)
			ans[i] = v;
	} else if (mid != l) {
		solve(p, k, ans, l, mid - 1, vl, v);
	}
	if (v == vr) {
		for (int i = mid + 1; i <= r; i++)
			ans[i] = v;
	} else if (mid != r) {
		solve(p, k, ans, mid + 1, r, v, vr);
	}
}

int32_t main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		tc.resize(n);
		for (int i = 0; i < n; i++)
			tc[i] = 0;
		vector<int> a(n), q(n);
		for (int i = 0; i < n; i++)
			cin >> a[i];
		for (int i = 0; i < n; i++)
			cin >> q[i];
		vector<int> ans(n);
		solve(a, q, ans, 0, n - 1, -1, -1);
		for (int i = 0; i < n; i++)
			cout << ans[i] << " \n"[i + 1 == n];
	}

	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3612kb

input:

1
5
2 5 3 1 4
1 4 5 3 2

output:

1 1 2 3 3

result:

ok 5 number(s): "1 1 2 3 3"

Test #2:

score: 0
Accepted
time: 7838ms
memory: 3992kb

input:

3
50000
22166 21423 37322 49151 2245 43507 37354 30961 32198 31003 32257 22468 27730 18919 2196 31303 3176 37808 4455 10088 18018 39466 29912 379 1832 17454 15968 4355 43806 24661 23628 14892 28610 44878 34190 33667 21697 4707 35211 12330 30832 8775 39434 26352 44030 31455 41042 11966 1147 39695 240...

output:

1 2 2 2 2 2 2 3 4 4 5 6 6 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 9 9 9 10 11 11 12 12 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 14 14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 16 16 16 17 17 17 17 17 17 17 18 18 18 18...

result:

ok 150000 numbers