社区讨论
14pts 悬多关求调
P1110[ZJOI2007] 报表统计参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mirduseo
- 此快照首次捕获于
- 2025/12/04 19:59 3 个月前
- 此快照最后确认于
- 2025/12/06 18:10 3 个月前
GO
#include<bits/stdc++.h>
#define int long long
using namespace std;
mt19937 rnd(time(nullptr));
const int inf = 0x7f7f7f7f;
const int N = 1e6 + 10;
const int M = 30;
int n,m;
vector<int> a[N];
string op;
int mnn = inf;
typedef struct chain{
int val,dto[M + 10];
struct chain* nxt[M + 10];
}* cp;
cp head,upd[M + 10];
int lv,tot[M + 10];
priority_queue<int,vector<int>,greater<int>> p1,p2;
void build(){
lv = 1;
head = new(chain);
head->val = -inf;
for(int i = M;i >= 1;-- i){
head->nxt[i] = nullptr;
upd[i] = head;
}
return;
}
int rndlvl(){
int x = 1;
for(;(rnd() & 1) && x < M;++ x);
return x;
}
int rnk(int x){
cp p = head;
tot[lv + 1] = 0;
for(int i = lv;i >= 1;-- i){
tot[i] = tot[i + 1];
while(p->nxt[i] && p->nxt[i]->val < x)
tot[i] += p->dto[i],p = p->nxt[i];
upd[i] = p;
}
return tot[1] + 1;
}
void insert(int x){
cp p = new(chain);
p->val = x;
rnk(x);
int lay = rndlvl();
lv = max(lay,lv);
for(int i = 1;i <= lay;++ i){
p->nxt[i] = upd[i]->nxt[i];
p->dto[i] = upd[i]->dto[i] - (tot[1] - tot[i]);
upd[i]->nxt[i] = p;
upd[i]->dto[i] = tot[1] - tot[i] + 1;
}
for(int i = lay + 1;i <= lv;++ i) ++ upd[i]->dto[i];
return;
}
int getpre(int x){
cp p = head;
for(int i = lv;i >= 1;-- i)
while(p->nxt[i] && p->nxt[i]->val < x)
p = p->nxt[i];
if(p->val != inf) return p->val;
return -inf;
}
int getnxt(int x){
cp p = head;
for(int i = lv;i >= 1;-- i)
while(p->nxt[i] && p->nxt[i]->val <= x)
p = p->nxt[i];
if(p->nxt[1]) return p->nxt[1]->val;
return inf;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);
build();
cin >> n >> m;
for(int i = 1;i <= n;++ i){
int x;
cin >> x;
a[i].emplace_back(x);
insert(x);
if(i != 1) p1.push(abs(x - a[i - 1][0]));
mnn = min(mnn,getnxt(x) - x);
mnn = min(mnn,x - getpre(x));
}
while(m --){
cin >> op;
if(op == "INSERT"){
int x,y;
cin >> x >> y;
insert(y);
mnn = min(mnn,getnxt(y) - y);
mnn = min(mnn,y - getpre(y));
if(x < n) p2.push(abs(a[x][a[x].size() - 1] - a[x + 1][0]));
p1.push(abs(y - a[x][a[x].size() - 1]));
if(x < n) p1.push(abs(y - a[x + 1][0]));
a[x].emplace_back(y);
}else if(op == "MIN_GAP"){
while(p2.top() == p1.top())
p1.pop(),p2.pop();
cout << p1.top() << '\n';
}else cout << mnn << '\n';
}
return 0;
}
WA on #2 #3 #4 #5
MLE on #6 #7
MLE on #6 #7
回复
共 0 条回复,欢迎继续交流。
正在加载回复...