题目不难,来吧,展示
代码
#include<iostream>
#include<cstring>
#include <string>
#include <algorithm>
using namespace std;
const int MAXN = 1000005;
const int INF=0x3f3f3f3f;
struct treap{
struct node{
int l,r;
int val, pri, size;
};
struct node* t;
int p, root;
treap():p(0),root(0){
t = (node*)malloc(MAXN * sizeof(node));
}
~treap(){
free((void*)t);
}
void update(int x)
{
t[x].size = 1 + t[t[x].l].size + t[t[x].r].size;
}
void split(int now, int v, int &x, int &y)
{
if(!now){
x=y=0;
return;
}
if(t[now].val<=v){
x=now;
split(t[now].r, v, t[now].r, y);
}
else{
y=now;
split(t[now].l, v, x, t[now].l);
}
update(now);
}
int merge(int x, int y)
{
if(!x || !y)
return x+y;
if(t[x].pri < t[y].pri){
t[x].r = merge(t[x].r, y);
update(x);
return x;
}
else{
t[y].l = merge(x, t[y].l);
update(y);
return y;
}
}
int create_node(int v)
{
t[++p].size=1;
t[p].val = v;
t[p].pri = rand();
return p;
}
void insert(int v)
{
int x,y;
split(root,v,x,y);
root=merge(merge(x,create_node(v)),y);
}
void del(int v)
{
int x,y,z;
split(root,v,x,y);
split(x, v-1, x, z);
z=merge(t[z].l, t[z].r);
root=merge(merge(x,z),y);
}
int rk(int v)
{
int x,y;
split(root, v-1, x, y);
int ans =t[x].size +1;
root = merge(x,y);
return ans;
}
int kth(int now, int k)
{
while(true){
if(k<=t[t[now].l].size)
now=t[now].l;
else if(k==t[t[now].l].size+1)
return t[now].val;
else{
k-=t[t[now].l].size + 1;
now = t[now].r;
}
}
}
int pre(int v)
{
int x,y;
split(root, v-1, x, y);
int ans = kth(x, t[x].size);
root=merge(x,y);
return ans;
}
int suc(int v)
{
int x,y;
split(root, v, x, y);
int ans = kth(y,1);
root=merge(x,y);
return ans;
}
int min_gap(int v){
int x, y;
split(root, v-1, x, y);
int tmp1, tmp2;
if(x == 0)
tmp1=INF;
else {
tmp1 = v - kth(x, t[x].size);
}
if (y == 0)
tmp2=INF;
else{
tmp2 = kth(y,1)- v;
}
root=merge(x,y);
return min(tmp1, tmp2);
}
};
int a[MAXN];
int b[MAXN];
int main()
{
int n,m;
string s;
cin>>n>>m;
treap t1,t2;
int min_sort_ans = INF;
for(int i = 1; i <= n; ++i){
cin >> a[i];
b[i] = a[i];
if(i >= 2){
t1.insert(abs(a[i] - a[i-1]));
}
min_sort_ans = min(min_sort_ans, t2.min_gap(a[i]));
t2.insert(a[i]);
}
for(int i = 1; i <= m; ++i){
cin >> s;
switch (s[4]){
case 'R':{
int i, k;
cin >> i >> k;
if(i < n){
t1.del(abs(a[i+1] - b[i]));
t1.insert(abs(a[i+1] - k));
}
t1.insert(abs(b[i] - k));
b[i] = k;
min_sort_ans = min(min_sort_ans, t2.min_gap(k));
t2.insert(k);
break;
}
case 'S':
cout << min_sort_ans << endl;
break;
case 'G':
cout << t1.kth(t1.root,1) << endl;
break;
}
}
return 0;
}
答案是对的100.