UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#210407#3788. 我可能是D题shiruiheng1004796ms164960kbC++116.0kb2024-08-06 12:02:362024-08-06 12:43:13

answer

#include<bits/stdc++.h>
using namespace std;
using ll = int;
//using LL = __int128
#define pi pair<ll, ll>
#define SqrtTreeItem ll
SqrtTreeItem op(const SqrtTreeItem &a, const SqrtTreeItem &b){
	return max(a, b);
}

int log2Up(int n) {
  int res = 0;
  while ((1 << res) < n) {
    res++;
  }
  return res;
}

class SqrtTree {
 private:
  int n, lg, indexSz;
  vector<SqrtTreeItem> v;
  vector<int> clz, layers, onLayer;
  vector<vector<SqrtTreeItem> > pref, suf, between;

  void buildBlock(int layer, int l, int r) {
    pref[layer][l] = v[l];
    for (int i = l + 1; i < r; i++) {
      pref[layer][i] = op(pref[layer][i - 1], v[i]);
    }
    suf[layer][r - 1] = v[r - 1];
    for (int i = r - 2; i >= l; i--) {
      suf[layer][i] = op(v[i], suf[layer][i + 1]);
    }
  }

  void buildBetween(int layer, int lBound, int rBound, int betweenOffs) {
    int bSzLog = (layers[layer] + 1) >> 1;
    int bCntLog = layers[layer] >> 1;
    int bSz = 1 << bSzLog;
    int bCnt = (rBound - lBound + bSz - 1) >> bSzLog;
    for (int i = 0; i < bCnt; i++) {
      SqrtTreeItem ans;
      for (int j = i; j < bCnt; j++) {
        SqrtTreeItem add = suf[layer][lBound + (j << bSzLog)];
        ans = (i == j) ? add : op(ans, add);
        between[layer - 1][betweenOffs + lBound + (i << bCntLog) + j] = ans;
      }
    }
  }

  void buildBetweenZero() {
    int bSzLog = (lg + 1) >> 1;
    for (int i = 0; i < indexSz; i++) {
      v[n + i] = suf[0][i << bSzLog];
    }
    build(1, n, n + indexSz, (1 << lg) - n);
  }

  void updateBetweenZero(int bid) {
    int bSzLog = (lg + 1) >> 1;
    v[n + bid] = suf[0][bid << bSzLog];
    update(1, n, n + indexSz, (1 << lg) - n, n + bid);
  }

  void build(int layer, int lBound, int rBound, int betweenOffs) {
    if (layer >= (int)layers.size()) {
      return;
    }
    int bSz = 1 << ((layers[layer] + 1) >> 1);
    for (int l = lBound; l < rBound; l += bSz) {
      int r = min(l + bSz, rBound);
      buildBlock(layer, l, r);
      build(layer + 1, l, r, betweenOffs);
    }
    if (layer == 0) {
      buildBetweenZero();
    } else {
      buildBetween(layer, lBound, rBound, betweenOffs);
    }
  }

  void update(int layer, int lBound, int rBound, int betweenOffs, int x) {
    if (layer >= (int)layers.size()) {
      return;
    }
    int bSzLog = (layers[layer] + 1) >> 1;
    int bSz = 1 << bSzLog;
    int blockIdx = (x - lBound) >> bSzLog;
    int l = lBound + (blockIdx << bSzLog);
    int r = min(l + bSz, rBound);
    buildBlock(layer, l, r);
    if (layer == 0) {
      updateBetweenZero(blockIdx);
    } else {
      buildBetween(layer, lBound, rBound, betweenOffs);
    }
    update(layer + 1, l, r, betweenOffs, x);
  }

  SqrtTreeItem query(int l, int r, int betweenOffs, int base) {
    if (l == r) {
      return v[l];
    }
    if (l + 1 == r) {
      return op(v[l], v[r]);
    }
    int layer = onLayer[clz[(l - base) ^ (r - base)]];
    int bSzLog = (layers[layer] + 1) >> 1;
    int bCntLog = layers[layer] >> 1;
    int lBound = (((l - base) >> layers[layer]) << layers[layer]) + base;
    int lBlock = ((l - lBound) >> bSzLog) + 1;
    int rBlock = ((r - lBound) >> bSzLog) - 1;
    SqrtTreeItem ans = suf[layer][l];
    if (lBlock <= rBlock) {
      SqrtTreeItem add =
          (layer == 0) ? (query(n + lBlock, n + rBlock, (1 << lg) - n, n))
                       : (between[layer - 1][betweenOffs + lBound +
                                             (lBlock << bCntLog) + rBlock]);
      ans = op(ans, add);
    }
    ans = op(ans, pref[layer][r]);
    return ans;
  }

 public:
  SqrtTreeItem query(int l, int r) { return query(l, r, 0, 0); }

  void update(int x, const SqrtTreeItem &item) {
    v[x] = item;
    update(0, 0, n, 0, x);
  }
  
  SqrtTree(){}
  
  SqrtTree(const vector<SqrtTreeItem> &a)
      : n((int)a.size()), lg(log2Up(n)), v(a), clz(1 << lg), onLayer(lg + 1) {
    clz[0] = 0;
    for (int i = 1; i < (int)clz.size(); i++) {
      clz[i] = clz[i >> 1] + 1;
    }
    int tlg = lg;
    while (tlg > 1) {
      onLayer[tlg] = (int)layers.size();
      layers.push_back(tlg);
      tlg = (tlg + 1) >> 1;
    }
    for (int i = lg - 1; i >= 0; i--) {
      onLayer[i] = max(onLayer[i], onLayer[i + 1]);
    }
    int betweenLayers = max(0, (int)layers.size() - 1);
    int bSzLog = (lg + 1) >> 1;
    int bSz = 1 << bSzLog;
    indexSz = (n + bSz - 1) >> bSzLog;
    v.resize(n + indexSz);
    pref.assign(layers.size(), vector<SqrtTreeItem>(n + indexSz));
    suf.assign(layers.size(), vector<SqrtTreeItem>(n + indexSz));
    between.assign(betweenLayers, vector<SqrtTreeItem>((1 << lg) + bSz));
    build(0, 0, n, 0);
  }
};
#define pi pair<ll, ll>
#define N 1111111
ll n, a[2][N], pos[N];
vector<ll> b[2];
ll ans;
ll v[2][N];
SqrtTree st[2];
int main(){
	scanf("%d", &n);
	if(n % 2 == 1){
		puts("-1");
		return 0;
	}
	for(int j = 0 ; j <= 1 ; j++){
		b[j].push_back(0);
		for(int i = 1 ; i <= n ; i++){
			scanf("%d", &a[j][i]);
			b[j].push_back(a[j][i]);
			v[pos[a[j][i]]++][a[j][i]] = j * n + i;
			//st[j][i][0] = a[j][i];
		}
		SqrtTree tmp(b[j]);
		swap(tmp, st[j]);
	}
	/*
	for(int j = 0 ; j <= 1 ; j++)
		for(int l = 1 ; l <= __lg(n) ; l++)
			for(int i = 1 ; i <= n ; i++){
				st[j][i][l] = max(st[j][i][l - 1], st[j][i + (1 << (l - 1))][l - 1]);
			}
	//*/
	for(int i = n ; i >= 1 ; i--){
		if((v[0][i] - 1) / n != (v[1][i] - 1) / n){
			//cerr << i << " " << v[i][0] / n << " " << v[i][1] / n;
			ans = max(ans, i);
			break;
		}
	}
	for(int i = n ; i > ans ; i--){
		//cerr << i << " ";
		if(v[0][i] > v[1][i])
			swap(v[0][i], v[1][i]);
		if((v[0][i] - 1) % n + 2 <= (v[1][i] - 1) % n)
			ans = max(ans, min(i, st[(v[0][i] - 1) / n].query((v[0][i] - 1) % n + 2, (v[1][i] - 1) % n)));
		//cerr << i << " " << qry((v[i][0] - 1) / n, (v[i][0] - 1) % n + 2, (v[i][1] - 1) % n) << "[" << (v[i][0] - 1) % n + 2 << "," << (v[i][1] - 1) % n << "]\n";
	}
	printf("%d", ans);
	return 0;
}

Details

小提示:点击横条可展开更详细的信息

Subtask #1:

score: 30
Accepted

Test #1:

score: 30
Accepted
time: 0ms
memory: 1276kb

input:

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

output:

6

result:

ok 1 number(s): "6"

Test #2:

score: 0
Accepted
time: 0ms
memory: 1276kb

input:

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

output:

1

result:

ok 1 number(s): "1"

Test #3:

score: 0
Accepted
time: 0ms
memory: 1276kb

input:

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

output:

0

result:

ok 1 number(s): "0"

Test #4:

score: 0
Accepted
time: 0ms
memory: 1272kb

input:

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

output:

0

result:

ok 1 number(s): "0"

Test #5:

score: 0
Accepted
time: 0ms
memory: 1272kb

input:

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

output:

4

result:

ok 1 number(s): "4"

Test #6:

score: 0
Accepted
time: 1ms
memory: 1272kb

input:

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

output:

5

result:

ok 1 number(s): "5"

Test #7:

score: 0
Accepted
time: 0ms
memory: 1276kb

input:

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

output:

3

result:

ok 1 number(s): "3"

Test #8:

score: 0
Accepted
time: 0ms
memory: 1276kb

input:

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

output:

2

result:

ok 1 number(s): "2"

Test #9:

score: 0
Accepted
time: 0ms
memory: 1276kb

input:

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

output:

7

result:

ok 1 number(s): "7"

Test #10:

score: 0
Accepted
time: 0ms
memory: 1276kb

input:

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

output:

4

result:

ok 1 number(s): "4"

Subtask #2:

score: 70
Accepted

Test #11:

score: 70
Accepted
time: 446ms
memory: 137524kb

input:

737172
591166  591166  314779  500354  500354  444684  376867  179299  83432  444684  541228  119435...

output:

401148

result:

ok 1 number(s): "401148"

Test #12:

score: 0
Accepted
time: 469ms
memory: 147320kb

input:

817160
336592  86064  430429  161510  365920  813186  374904  83170  437514  611813  250890  280848 ...

output:

760052

result:

ok 1 number(s): "760052"

Test #13:

score: 0
Accepted
time: 532ms
memory: 164360kb

input:

958446
272443  272443  938537  938537  108057  108057  575481  575481  271499  271499  813414  81341...

output:

12773

result:

ok 1 number(s): "12773"

Test #14:

score: 0
Accepted
time: 363ms
memory: 134908kb

input:

713814
461441  573254  573254  513511  15310  513511  402221  439194  284044  455271  548338  212392...

output:

473564

result:

ok 1 number(s): "473564"

Test #15:

score: 0
Accepted
time: 573ms
memory: 164960kb

input:

963580
885604  78285  286832  467363  55256  179487  85268  643812  183180  276505  234673  563562  ...

output:

875314

result:

ok 1 number(s): "875314"

Test #16:

score: 0
Accepted
time: 491ms
memory: 154828kb

input:

878538
342829  695013  335774  695013  129194  119910  197061  442313  423966  648576  146776  24958...

output:

517321

result:

ok 1 number(s): "517321"

Test #17:

score: 0
Accepted
time: 511ms
memory: 146152kb

input:

807572
418245  418245  508254  508254  104475  104475  438011  438011  128163  128163  729347  72934...

output:

42765

result:

ok 1 number(s): "42765"

Test #18:

score: 0
Accepted
time: 417ms
memory: 133272kb

input:

700942
455661  455661  28272  311687  311687  190573  292978  608363  608363  663350  37455  663350 ...

output:

305348

result:

ok 1 number(s): "305348"

Test #19:

score: 0
Accepted
time: 450ms
memory: 158520kb

input:

910142
521130  32278  521130  200249  200249  136273  136273  705627  705627  904306  904306  333391...

output:

39269

result:

ok 1 number(s): "39269"

Test #20:

score: 0
Accepted
time: 543ms
memory: 162676kb

input:

944974
858405  858405  308007  308007  59819  265218  85090  265218  311380  311380  792000  792000 ...

output:

125900

result:

ok 1 number(s): "125900"

Extra Test:

score: 0
Extra Test Passed