ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#210407 | #3788. 我可能是D题 | shiruiheng | 100 | 4796ms | 164960kb | C++11 | 6.0kb | 2024-08-06 12:02:36 | 2024-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