QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#545107#7685. Barkley IIPonyHexRE 114ms5864kbC++143.3kb2024-09-02 22:48:192024-09-02 22:48:19

Judging History

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

  • [2024-09-02 22:48:19]
  • 评测
  • 测评结果:RE
  • 用时:114ms
  • 内存:5864kb
  • [2024-09-02 22:48:19]
  • 提交

answer

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define ll long long
#define lc u<<1
#define rc u<<1|1
#define X first
#define Y second
//#define int long long
const int N = 2e5 + 50;
const int M = 2005;
const ll maxm = 1e18 + 5;
const ll mod = 998244353;

ll a[N];

struct node {
	int l, r;
	int sum;
}t[N * 4];

void pushup(int u) {
	t[u].sum = t[lc].sum + t[rc].sum; return;
}

void build_ST(int u, int l, int r) {
	t[u].l = l; t[u].r = r; t[u].sum = 0;
	if (l == r) {
		t[u].sum = 0; return;
	}
	int mid = (l + r) >> 1;
	build_ST(lc, l, mid);
	build_ST(rc, mid + 1, r);
	//pushup(u);
	return;
}

ll query(int u, int x, int y) {
	if (x <= t[u].l && t[u].r <= y) {
		return t[u].sum;
	}
	int mid = (t[u].l + t[u].r) >> 1;
	ll ans = 0;
	if (x <= mid)ans += query(lc, x, y);
	if (mid + 1 <= y)ans += query(rc, x, y);
	return ans;
}

void modify(int u, int x,int val) {
	if (t[u].l == t[u].r) {
		t[u].sum = val; return;
	}
	int mid = (t[u].l + t[u].r) >> 1;
	if (x <= mid)modify(lc, x,val);
	else modify(rc, x,val);
	pushup(u);
	return;
}


void solve()
{
	//简单看了一下线段树维护区间不同元素个数的思路
	//本质上,并不是就说,能应对随机的查询
	//感觉维护区间的时候,无需执着于预处理,然后处理随机的查询
	//就是,查询我们也可以利用一下,单调的查询非常有用
	//像这个题,我们就可以利用查询的单调性,就,右端点是单增的
	//就是就是,在这样的情况下,我们仅保留最右侧的相同元素即可
	//然后将前置的相同的元素置零,,在线段树中进行区间修改
	unordered_map<ll, ll>has;//标记上一个元素出现的位置
	ll n, m; cin >> n >> m;
	for (int i = 1; i <= n; i++)cin >> a[i];
	
	//我想想,树一开始应该怎么建,都建0是不是比较好
	build_ST(1, 1, n);

	ll ans = -maxm;//以某个元素为断点
	for (int i = 1; i <= n; i++) {
		ll st = has[a[i]]+1, ed = i-1;
		if (a[i] == 1) {
			ans = max(ans, -1ll);
		}
		else {
			ans = max(ans, 1 - (a[i] - 1));
		}
		if (ed >= st) {//能获取区间
			ans = max(ans, query(1, st, ed)-(a[i]));
			//cout << st << " " << ed << " " << a[i] << " " << query(1, st, ed) << endl;
			//更新ans后更新树,map,
			
			//仅保留最后一个位置

		}
		modify(1, i, 1);//对这个位置的叶子修改为1
		//cout << i <<" "<< query(1, 1, i) << endl;
		if (st - 1 >= 1) {
			modify(1, st - 1, 0); //cout << "kklk" << endl;
		}
		has[a[i]] = i;
	}
	for (auto p = has.begin(); p != has.end(); p++) {
		ll st = (p->Y)+1;
		ll ed = n;
		if (ed >= st) {
			ans = max(ans, query(1, st, ed) - (p->X));
		}
		
	}
	sort(a + 1, a + 1 + n);
	ll val = 1;
	for (int i = 1; i <= n; i++) {
		if (a[i] == val) {
			val++;
		}
		else if (a[i] > val)break;
	}
	//cout << ans << endl;
	ans = max(ans, query(1, 1, n) - val);
	cout << ans << endl;
	return;
}


signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int T = 1;
	std::cin >> T;
	while (T--)
		solve();
	return 0;
}


ll ksm(ll a, ll b) {
    ll base = a;
    ll ans = 1;
    while (b) {
        if (b & 1)ans *= base;
        base *= base;
        b >>= 1;
    }
    return ans;
}
ll gcd(ll a, ll b) {
    return b ? gcd(b, a % b) : a;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

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

output:

2
3

result:

ok 2 number(s): "2 3"

Test #2:

score: 0
Accepted
time: 62ms
memory: 5864kb

input:

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

output:

6
5
4
4
2
4
3
7
4
4
4
5
2
3
6
6
7
5
7
6
5
5
6
2
6
8
7
2
5
5
6
2
2
3
4
5
3
3
7
3
2
5
6
1
3
5
3
3
3
8
6
6
5
7
4
4
5
4
6
6
6
3
7
3
6
3
3
7
7
6
6
7
4
3
3
4
4
6
3
4
6
6
4
5
5
9
4
5
7
5
3
5
2
2
5
6
6
8
4
3
4
5
5
5
7
7
3
2
6
5
3
5
4
4
5
6
6
5
6
7
7
4
5
7
4
7
3
7
6
6
6
5
4
2
5
4
2
3
6
5
2
6
5
5
4
3
5
6
6
6
...

result:

ok 50000 numbers

Test #3:

score: 0
Accepted
time: 96ms
memory: 5536kb

input:

100000
5 4
4 3 1 3 1
5 4
2 2 1 3 4
5 9
7 8 7 1 3
5 3
3 2 2 3 1
5 7
1 4 2 4 7
5 4
4 4 4 2 3
5 3
2 1 2 2 2
5 5
2 1 2 5 4
5 9
1 8 4 4 7
5 6
2 6 4 6 2
5 5
1 2 4 4 4
5 3
2 1 1 1 3
5 5
5 4 5 2 5
5 4
3 3 3 2 1
5 3
3 1 3 2 3
5 7
1 5 2 2 7
5 6
2 2 6 5 6
5 10
6 3 3 1 7
5 8
1 6 8 4 3
5 4
1 2 1 3 3
5 7
2 2 4 3 ...

output:

1
1
2
1
2
2
0
2
2
2
1
0
2
1
1
2
2
2
3
0
3
1
2
2
3
3
1
3
0
0
3
2
2
0
2
2
1
0
2
2
3
3
3
1
3
2
2
3
2
3
2
1
2
3
1
3
3
1
2
3
1
1
2
2
2
2
0
1
0
1
0
2
1
3
0
2
2
3
2
2
1
3
1
3
1
1
1
3
1
1
4
0
1
3
2
2
2
0
3
2
4
3
3
2
1
0
4
4
3
2
1
2
1
2
3
2
3
4
4
3
0
0
1
4
1
3
3
2
3
1
3
4
3
1
2
2
3
2
3
2
3
3
1
3
1
1
4
1
1
3
...

result:

ok 100000 numbers

Test #4:

score: 0
Accepted
time: 91ms
memory: 5532kb

input:

25000
20 28
4 28 8 7 8 23 13 27 1 3 24 19 21 7 21 6 10 3 1 8
20 18
6 13 17 2 4 11 12 5 10 8 1 3 5 18 10 2 8 15 4 17
20 17
5 9 5 15 7 11 16 2 16 17 15 11 3 12 13 12 11 17 15 14
20 28
12 17 26 1 21 18 9 12 22 3 7 24 5 8 20 3 25 28 17 20
20 13
9 10 4 9 10 13 4 3 3 9 12 8 4 12 2 2 6 10 13 5
20 22
17 13 ...

output:

12
9
11
14
9
12
9
15
6
11
8
13
14
13
7
11
8
13
11
11
14
14
7
15
10
10
10
12
9
13
12
10
10
14
14
11
9
8
9
10
10
5
11
14
13
14
13
8
8
12
10
10
17
12
7
14
9
11
14
13
8
12
15
13
14
11
9
8
11
17
9
12
11
13
13
10
14
10
10
16
12
13
12
11
14
12
9
12
5
9
15
16
13
15
7
14
12
6
12
13
7
8
12
10
13
15
9
16
7
16
...

result:

ok 25000 numbers

Test #5:

score: 0
Accepted
time: 114ms
memory: 3492kb

input:

5000
100 100
71 48 44 27 73 73 90 42 69 81 79 99 97 3 45 78 38 92 89 27 97 7 4 91 42 59 7 45 88 100 15 66 64 6 26 54 38 38 72 81 15 94 35 63 33 85 100 16 41 5 71 20 92 36 39 59 19 59 11 22 11 26 94 29 73 98 16 16 47 25 35 50 49 6 67 85 69 90 6 87 72 24 37 62 55 54 25 38 95 14 15 26 89 26 25 46 14 24...

output:

59
78
69
48
78
53
64
73
53
66
59
57
62
42
73
69
46
68
66
47
59
64
71
57
73
43
52
66
67
61
66
66
65
58
80
65
65
69
75
76
69
39
69
61
53
72
44
62
63
71
76
56
69
79
49
73
62
71
83
59
70
53
69
73
47
68
74
59
66
74
75
61
53
76
48
62
79
71
47
72
40
80
62
42
63
70
72
70
70
59
68
56
74
54
61
78
68
75
70
39
...

result:

ok 5000 numbers

Test #6:

score: -100
Runtime Error

input:

2
250000 144237
103523 38477 80037 110169 8464 110583 60349 74339 29012 8989 96955 23403 38383 12186 107503 109176 1709 31839 109579 62912 130470 26082 102718 25272 17893 55607 48053 34513 23154 136492 8313 136454 57920 60639 68601 50656 16871 101625 88777 35367 62644 80269 24346 33961 74832 62520 8...

output:


result: